aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnji Cooper <ngie@FreeBSD.org>2026-02-15 01:45:16 +0000
committerEnji Cooper <ngie@FreeBSD.org>2026-02-15 01:45:16 +0000
commit56a7ce8416d181a2060d7a428aed9c3c6a431e6d (patch)
tree102efa260400b2c1ef36733c53fbe2e6b747405c
parenta339cc353658ca6abbf6ad2919a9269210475b41 (diff)
-rw-r--r--Makefile4
-rw-r--r--bin/cat/t_cat.sh20
-rw-r--r--bin/cp/t_cp.sh54
-rw-r--r--bin/dd/t_dd.sh112
-rw-r--r--bin/df/t_df.sh134
-rw-r--r--bin/expr/t_expr.sh308
-rw-r--r--bin/pax/t_pax.sh104
-rw-r--r--bin/sh/t_arith.sh15
-rw-r--r--bin/sh/t_builtins.sh4
-rw-r--r--bin/sh/t_fsplit.sh271
-rw-r--r--bin/sh/t_input.sh4
-rw-r--r--bin/sh/t_shift.sh75
-rw-r--r--bin/sh/t_syntax.sh4
-rw-r--r--bin/sh/t_ulimit.sh6
-rw-r--r--bin/sh/t_varquote.sh8
-rw-r--r--bin/tar/t_tar.sh14
-rw-r--r--crypto/libcrypto/Makefile6
-rw-r--r--crypto/libcrypto/Makefile.inc4
-rw-r--r--crypto/libcrypto/bn/div/divtest.c4
-rw-r--r--crypto/libcrypto/dh/Makefile2
-rw-r--r--crypto/libcrypto/ec/Makefile3
-rw-r--r--crypto/libcrypto/t_libcrypto.sh4
-rw-r--r--crypto/libcrypto/t_pubkey.sh3
-rw-r--r--crypto/libcrypto/threads/Makefile11
-rw-r--r--crypto/opencrypto/t_opencrypto.sh7
-rw-r--r--dev/audio/audiotest.c12
-rw-r--r--dev/audio/h_pad.c3
-rwxr-xr-xdev/fss/t_fss.sh5
-rw-r--r--fs/Makefile51
-rw-r--r--fs/cd9660/Makefile15
-rw-r--r--fs/cd9660/pr_48787.image.bz2.uue103
-rw-r--r--fs/cd9660/t_high_ino_big_file.sh19
-rw-r--r--fs/common/fstest_lfs.c69
-rw-r--r--fs/common/fstest_nfs.c4
-rw-r--r--fs/common/fstest_v7fs.c5
-rw-r--r--fs/common/h_fsmacros.h43
-rw-r--r--fs/ffs/h_quota2_tests.c4
-rw-r--r--fs/hfs/t_pathconvert.c6
-rw-r--r--fs/lfs/Makefile10
-rw-r--r--fs/lfs/t_rfw.c221
-rw-r--r--fs/nullfs/t_basic.c14
-rw-r--r--fs/psshfs/t_psshfs.sh32
-rw-r--r--fs/tmpfs/h_funcs.subr8
-rw-r--r--fs/tmpfs/t_create.sh26
-rw-r--r--fs/tmpfs/t_devices.sh10
-rw-r--r--fs/tmpfs/t_dots.sh16
-rw-r--r--fs/tmpfs/t_exec.sh6
-rw-r--r--fs/tmpfs/t_link.sh32
-rw-r--r--fs/tmpfs/t_mkdir.sh36
-rw-r--r--fs/tmpfs/t_mknod.sh14
-rw-r--r--fs/tmpfs/t_mount.sh14
-rw-r--r--fs/tmpfs/t_pipes.sh4
-rw-r--r--fs/tmpfs/t_read_write.sh4
-rw-r--r--fs/tmpfs/t_readdir.sh40
-rw-r--r--fs/tmpfs/t_remove.sh36
-rw-r--r--fs/tmpfs/t_rename.sh164
-rw-r--r--fs/tmpfs/t_rmdir.sh64
-rw-r--r--fs/tmpfs/t_setattr.sh32
-rw-r--r--fs/tmpfs/t_sizes.sh20
-rw-r--r--fs/tmpfs/t_sockets.sh8
-rw-r--r--fs/tmpfs/t_symlink.sh36
-rw-r--r--fs/tmpfs/t_times.sh14
-rw-r--r--fs/tmpfs/t_trail_slash.sh12
-rw-r--r--fs/tmpfs/t_truncate.sh4
-rw-r--r--fs/tmpfs/t_vnd.sh33
-rw-r--r--fs/tmpfs/t_vnode_leak.sh4
-rw-r--r--fs/union/t_pr.c42
-rw-r--r--fs/vfs/t_vfsops.c5
-rw-r--r--games/Makefile3
-rw-r--r--games/t_factor.sh4
-rw-r--r--include/Makefile3
-rw-r--r--include/sys/Makefile6
-rw-r--r--include/sys/t_bitops.c72
-rw-r--r--include/sys/t_list.c4
-rw-r--r--kernel/Makefile127
-rw-r--r--kernel/h_segv.c17
-rw-r--r--kernel/kqueue/read/t_fifo.c6
-rw-r--r--kernel/kqueue/t_empty.c7
-rw-r--r--kernel/kqueue/t_sig.c6
-rw-r--r--kernel/t_memfd_create.c151
-rw-r--r--kernel/t_rnd.c8
-rw-r--r--kernel/t_umount.sh22
-rw-r--r--kernel/t_umountstress.sh10
-rw-r--r--lib/Makefile16
-rw-r--r--lib/csu/Makefile33
-rw-r--r--lib/csu/arch/riscv/h_initfini_align.S6
-rw-r--r--lib/csu/h_initfini_array.c2
-rw-r--r--lib/csu/t_crt0.sh13
-rw-r--r--lib/libarchive/Makefile733
-rw-r--r--lib/libc/atomic/t___sync_compare_and_swap.c148
-rw-r--r--lib/libc/atomic/t___sync_lock.c72
-rw-r--r--lib/libc/c063/t_faccessat.c73
-rw-r--r--lib/libc/c063/t_fchmodat.c17
-rw-r--r--lib/libc/c063/t_utimensat.c143
-rw-r--r--lib/libc/gen/Makefile17
-rw-r--r--lib/libc/gen/execve/t_execve.c59
-rw-r--r--lib/libc/gen/posix_spawn/fa_spawn_utils.c24
-rw-r--r--lib/libc/gen/posix_spawn/fa_spawn_utils.h12
-rw-r--r--lib/libc/gen/posix_spawn/t_fileactions.c339
-rw-r--r--lib/libc/gen/posix_spawn/t_spawn.c370
-rw-r--r--lib/libc/gen/posix_spawn/t_spawnattr.c102
-rw-r--r--lib/libc/gen/t_floatunditf.c20
-rw-r--r--lib/libc/gen/t_fmtcheck.c6
-rw-r--r--lib/libc/gen/t_fpclassify.c1173
-rw-r--r--lib/libc/gen/t_fpsetmask.c21
-rw-r--r--lib/libc/gen/t_fpsetround.c45
-rw-r--r--lib/libc/gen/t_isnan.c11
-rw-r--r--lib/libc/gen/t_siginfo.c19
-rw-r--r--lib/libc/gen/t_sleep.c80
-rw-r--r--lib/libc/hash/Makefile2
-rw-r--r--lib/libc/kevent_nullmnt/t_nullmnt.sh22
-rw-r--r--lib/libc/locale/Makefile32
-rw-r--r--lib/libc/locale/t_strfmon.c236
-rw-r--r--lib/libc/membar/t_spinlock.c4
-rw-r--r--lib/libc/misc/Makefile17
-rw-r--r--lib/libc/regex/Makefile13
-rw-r--r--lib/libc/setjmp/Makefile3
-rw-r--r--lib/libc/setjmp/t_setjmp.c254
-rw-r--r--lib/libc/ssp/Makefile3
-rw-r--r--lib/libc/ssp/t_ssp.sh16
-rw-r--r--lib/libc/stdio/t_fflush.c42
-rw-r--r--lib/libc/stdio/t_intr.sh7
-rw-r--r--lib/libc/stdio/t_printf.c74
-rw-r--r--lib/libc/stdlib/Makefile6
-rw-r--r--lib/libc/stdlib/t_strtod.c218
-rw-r--r--lib/libc/stdlib/t_strtoi.c145
-rw-r--r--lib/libc/stdlib/t_strtol.c78
-rw-r--r--lib/libc/string/t_bm.c10
-rw-r--r--lib/libc/string/t_memset.c137
-rw-r--r--lib/libc/sys/Makefile23
-rw-r--r--lib/libc/sys/t_clock_gettime.c46
-rw-r--r--lib/libc/sys/t_clone.c57
-rw-r--r--lib/libc/sys/t_dup.c8
-rw-r--r--lib/libc/sys/t_futex_ops.c614
-rw-r--r--lib/libc/sys/t_getitimer.c57
-rw-r--r--lib/libc/sys/t_getrusage.c5
-rw-r--r--lib/libc/sys/t_kill.c17
-rw-r--r--lib/libc/sys/t_pipe2.c35
-rw-r--r--lib/libc/sys/t_poll.c1859
-rw-r--r--lib/libc/sys/t_posix_fadvise.c15
-rw-r--r--lib/libc/sys/t_ptrace.c89
-rw-r--r--lib/libc/sys/t_ptrace_amd64_wait.h3
-rw-r--r--lib/libc/sys/t_ptrace_bytetransfer_wait.h4
-rw-r--r--lib/libc/sys/t_ptrace_clone_wait.h3
-rw-r--r--lib/libc/sys/t_ptrace_core_wait.h6
-rw-r--r--lib/libc/sys/t_ptrace_eventmask_wait.h3
-rw-r--r--lib/libc/sys/t_ptrace_fork_wait.h8
-rw-r--r--lib/libc/sys/t_ptrace_lwp_wait.h3
-rw-r--r--lib/libc/sys/t_ptrace_register_wait.h3
-rw-r--r--lib/libc/sys/t_ptrace_sigchld.c17
-rw-r--r--lib/libc/sys/t_ptrace_siginfo_wait.h6
-rw-r--r--lib/libc/sys/t_ptrace_signal_wait.h282
-rw-r--r--lib/libc/sys/t_ptrace_syscall_wait.h3
-rw-r--r--lib/libc/sys/t_ptrace_threads_wait.h46
-rw-r--r--lib/libc/sys/t_ptrace_topology_wait.h3
-rw-r--r--lib/libc/sys/t_ptrace_wait.c15
-rw-r--r--lib/libc/sys/t_ptrace_wait.h92
-rw-r--r--lib/libc/sys/t_ptrace_x86_wait.h427
-rw-r--r--lib/libc/sys/t_select.c45
-rw-r--r--lib/libc/sys/t_setrlimit.c149
-rw-r--r--lib/libc/sys/t_sigtimedwait.c161
-rw-r--r--lib/libc/sys/t_socketpair.c35
-rw-r--r--lib/libc/sys/t_swapcontext.c14
-rw-r--r--lib/libc/sys/t_timer_create.c331
-rw-r--r--lib/libc/sys/t_timerfd.c177
-rw-r--r--lib/libc/time/t_strptime.c156
-rw-r--r--lib/libc/ttyio/t_ptm.c11
-rw-r--r--lib/libcurses/check_files/addstr3.chk2
-rw-r--r--lib/libcurses/check_files/color_blank_draw.chk46
-rw-r--r--lib/libcurses/check_files/slk6.chk2
-rw-r--r--lib/libcurses/check_files/waddstr2.chk5
-rwxr-xr-xlib/libcurses/debug_test13
-rw-r--r--lib/libcurses/director/director.c9
-rw-r--r--lib/libcurses/director/testlang_conf.l8
-rw-r--r--lib/libcurses/director/testlang_parse.y11
-rw-r--r--lib/libcurses/slave/commands.c4
-rw-r--r--lib/libcurses/t_curses.sh2
-rw-r--r--lib/libcurses/testframe.txt6
-rw-r--r--lib/libcurses/tests/curs_set2
-rw-r--r--lib/libdes/t_des.c4
-rw-r--r--lib/libexecinfo/Makefile3
-rw-r--r--lib/libexecinfo/t_sig_backtrace.c17
-rw-r--r--lib/libm/Makefile5
-rw-r--r--lib/libm/t_asin.c7
-rw-r--r--lib/libm/t_bit.c103
-rw-r--r--lib/libm/t_cabsl.cxx6
-rw-r--r--lib/libm/t_cbrt.c9
-rw-r--r--lib/libm/t_cos.c52
-rw-r--r--lib/libm/t_fe_round.c567
-rw-r--r--lib/libm/t_fenv.c270
-rw-r--r--lib/libm/t_hypot.c656
-rw-r--r--lib/libm/t_ilogb.c72
-rw-r--r--lib/libm/t_infinity.c10
-rw-r--r--lib/libm/t_log.c1196
-rw-r--r--lib/libm/t_modf.c407
-rw-r--r--lib/libm/t_pow.c337
-rw-r--r--lib/libm/t_precision.c8
-rw-r--r--lib/libm/t_round.c4
-rw-r--r--lib/libm/t_scalbn.c35
-rw-r--r--lib/libm/t_sin.c28
-rw-r--r--lib/libm/t_sincos.c7
-rw-r--r--lib/libm/t_tan.c28
-rw-r--r--lib/libprop/t_proplib.c59
-rw-r--r--lib/libpthread/Makefile13
-rw-r--r--lib/libpthread/dlopen/t_dlopen.c133
-rw-r--r--lib/libpthread/dlopen/t_dso_pthread_create.c43
-rw-r--r--lib/libpthread/t_once.c78
-rw-r--r--lib/librefuse/t_refuse_opt.c102
-rw-r--r--lib/librumpclient/t_exec.sh14
-rw-r--r--lib/librumpclient/t_fd.c6
-rw-r--r--lib/librumphijack/t_tcpip.sh33
-rw-r--r--lib/libutil/Makefile3
-rw-r--r--lib/libutil/t_snprintb.c1644
-rw-r--r--lib/libutil/t_sockaddr_snprintf.c165
-rw-r--r--libexec/ld.elf_so/Makefile79
-rw-r--r--libexec/ld.elf_so/t_dlinfo.c21
-rw-r--r--libexec/ld.elf_so/t_hash.c3
-rw-r--r--libexec/ld.elf_so/t_rtld_r_debug.c73
-rw-r--r--libexec/ld.elf_so/t_tls_extern.c62
-rw-r--r--modules/t_abi_uvm.sh4
-rw-r--r--modules/t_klua_pr_52864.sh8
-rw-r--r--modules/t_modload.sh58
-rw-r--r--modules/t_threadpool.sh10
-rw-r--r--net/Makefile4
-rw-r--r--net/arp/t_arp.sh405
-rw-r--r--net/arp/t_dad.sh92
-rw-r--r--net/bpf/Makefile4
-rw-r--r--net/can/Makefile4
-rw-r--r--net/carp/t_basic.sh5
-rw-r--r--net/if_bridge/Makefile5
-rw-r--r--net/if_bridge/t_bridge.sh212
-rw-r--r--net/if_ipsec/t_ipsec_unnumbered.sh4
-rw-r--r--net/if_lagg/t_lagg.sh47
-rw-r--r--net/if_tap/t_tap.sh4
-rw-r--r--net/if_vlan/t_vlan.sh488
-rw-r--r--net/if_wg/t_basic.sh55
-rw-r--r--net/if_wg/t_misc.sh35
-rw-r--r--net/ipsec/t_ipsec_gif.sh10
-rw-r--r--net/ipsec/t_ipsec_l2tp.sh8
-rw-r--r--net/net/t_forwarding.sh4
-rw-r--r--net/net/t_tcp.c8
-rw-r--r--net/net/t_unix.c103
-rw-r--r--net/net_common.sh6
-rw-r--r--net/npf/Makefile3
-rw-r--r--net/npf/t_npf.sh24
-rw-r--r--rump/kernspace/threadpool.c6
-rw-r--r--rump/rumpkern/t_sp.sh34
-rw-r--r--rump/rumpkern/t_vm.c9
-rw-r--r--sbin/fsck_ffs/quotas_common.sh31
-rw-r--r--sbin/fsck_ffs/t_check_quotas.sh42
-rw-r--r--sbin/fsck_ffs/t_enable_quotas.sh67
-rw-r--r--sbin/fsck_ffs/t_extattr.sh145
-rw-r--r--sbin/gpt/Makefile10
-rw-r--r--sbin/gpt/gpt.2part.show.label16
-rw-r--r--sbin/gpt/gpt.2part.show.normal16
-rw-r--r--sbin/gpt/gpt.2part.show.uuid16
-rw-r--r--sbin/gpt/gpt.disklabel.show.normal24
-rw-r--r--sbin/gpt/gpt.empty.show.normal14
-rw-r--r--sbin/gpt/gpt.removepart.show.normal16
-rw-r--r--sbin/gpt/gpt.resizedisk.show.normal18
-rw-r--r--sbin/gpt/gpt.resizepart.show.normal16
-rw-r--r--sbin/gpt/t_gpt.sh22
-rw-r--r--sbin/ifconfig/t_capabilities.sh6
-rw-r--r--sbin/newfs_msdos/t_create.sh6
-rw-r--r--sys/crypto/aes/Makefile31
-rw-r--r--sys/crypto/aes/t_aes.c34
-rw-r--r--sys/crypto/chacha/Makefile4
-rwxr-xr-xsys/rc/h_args.sh4
-rw-r--r--sys/rc/t_rc_d_cli.sh20
-rw-r--r--usr.bin/Makefile13
-rw-r--r--usr.bin/c++/t_call_once.sh26
-rw-r--r--usr.bin/c++/t_cxxruntime.sh26
-rw-r--r--usr.bin/c++/t_hello.sh26
-rw-r--r--usr.bin/c++/t_pthread_once.sh26
-rw-r--r--usr.bin/c++/t_static_destructor.sh378
-rw-r--r--usr.bin/cc/Makefile6
-rw-r--r--usr.bin/cc/t_hello.sh8
-rw-r--r--usr.bin/config/t_config.sh6
-rw-r--r--usr.bin/cpio/Makefile6
-rw-r--r--usr.bin/cut/t_cut.sh19
-rw-r--r--usr.bin/diff/Makefile21
-rw-r--r--usr.bin/diff/t_diff.sh105
-rw-r--r--usr.bin/grep/t_grep.sh23
-rw-r--r--usr.bin/gzip/t_gzip.sh120
-rw-r--r--usr.bin/id/t_groups.sh16
-rw-r--r--usr.bin/id/t_id.sh176
-rw-r--r--usr.bin/id/t_whoami.sh10
-rw-r--r--usr.bin/indent/fmt_expr.c27
-rw-r--r--usr.bin/indent/lsym_comment.c5
-rw-r--r--usr.bin/indent/lsym_lparen_or_lbracket.c8
-rw-r--r--usr.bin/indent/lsym_rbrace.c7
-rw-r--r--usr.bin/indent/lsym_unary_op.c6
-rw-r--r--usr.bin/indent/lsym_while.c5
-rw-r--r--usr.bin/indent/opt_bad.c4
-rw-r--r--usr.bin/indent/opt_bl_br.c5
-rw-r--r--usr.bin/indent/psym_do_stmt.c20
-rw-r--r--usr.bin/indent/psym_else.c4
-rw-r--r--usr.bin/indent/psym_for_exprs.c25
-rw-r--r--usr.bin/indent/psym_if_expr_stmt.c31
-rw-r--r--usr.bin/indent/psym_if_expr_stmt_else.c32
-rw-r--r--usr.bin/indent/psym_while_expr.c8
-rw-r--r--usr.bin/indent/t_errors.sh11
-rw-r--r--usr.bin/indent/t_misc.sh19
-rw-r--r--usr.bin/indent/t_options.lua51
-rw-r--r--usr.bin/netpgpverify/Makefile59
-rw-r--r--usr.bin/netpgpverify/Testspec68
-rw-r--r--usr.bin/netpgpverify/t_netpgpverify.sh7429
-rw-r--r--usr.bin/sdiff/t_sdiff.sh44
-rw-r--r--usr.bin/sed/t_sed.sh24
-rw-r--r--usr.bin/tar/Makefile5
-rw-r--r--usr.bin/xlint/lint1/Makefile34
-rw-r--r--usr.bin/xlint/lint1/accept.sh15
-rw-r--r--usr.bin/xlint/lint1/c11.c70
-rw-r--r--usr.bin/xlint/lint1/c11_generic_expression.c30
-rw-r--r--usr.bin/xlint/lint1/c23.c159
-rw-r--r--usr.bin/xlint/lint1/c90.c11
-rw-r--r--usr.bin/xlint/lint1/check-expect.lua50
-rw-r--r--usr.bin/xlint/lint1/d_bltinoffsetof.c50
-rw-r--r--usr.bin/xlint/lint1/d_c99_bool_strict.c312
-rw-r--r--usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c222
-rw-r--r--usr.bin/xlint/lint1/d_c99_for_loops.c19
-rw-r--r--usr.bin/xlint/lint1/d_c99_func.c16
-rw-r--r--usr.bin/xlint/lint1/d_c99_init.c566
-rw-r--r--usr.bin/xlint/lint1/d_c99_struct_init.c25
-rw-r--r--usr.bin/xlint/lint1/d_c99_union_init1.c15
-rw-r--r--usr.bin/xlint/lint1/d_c99_union_init2.c13
-rw-r--r--usr.bin/xlint/lint1/d_c99_union_init3.c15
-rw-r--r--usr.bin/xlint/lint1/d_c99_union_init4.c20
-rw-r--r--usr.bin/xlint/lint1/d_c99_union_init5.c20
-rw-r--r--usr.bin/xlint/lint1/d_c9x_array_init.c11
-rw-r--r--usr.bin/xlint/lint1/d_cast_lhs.c32
-rw-r--r--usr.bin/xlint/lint1/d_compound_literals1.c16
-rw-r--r--usr.bin/xlint/lint1/d_compound_literals2.c24
-rw-r--r--usr.bin/xlint/lint1/d_constant_conv1.c15
-rw-r--r--usr.bin/xlint/lint1/d_constant_conv2.c21
-rw-r--r--usr.bin/xlint/lint1/d_cvt_constant.c13
-rw-r--r--usr.bin/xlint/lint1/d_cvt_in_ternary.c19
-rw-r--r--usr.bin/xlint/lint1/d_decl_old_style_arguments.c1
-rw-r--r--usr.bin/xlint/lint1/d_ellipsis_in_switch.c19
-rw-r--r--usr.bin/xlint/lint1/d_gcc_extension.c22
-rw-r--r--usr.bin/xlint/lint1/d_gcc_func.c13
-rw-r--r--usr.bin/xlint/lint1/d_gcc_variable_array_init.c14
-rw-r--r--usr.bin/xlint/lint1/d_incorrect_array_size.c7
-rw-r--r--usr.bin/xlint/lint1/d_init_array_using_string.c87
-rw-r--r--usr.bin/xlint/lint1/d_init_pop_member.c62
-rw-r--r--usr.bin/xlint/lint1/d_long_double_int.c13
-rw-r--r--usr.bin/xlint/lint1/d_nested_structs.c26
-rw-r--r--usr.bin/xlint/lint1/d_pr_22119.c23
-rw-r--r--usr.bin/xlint/lint1/d_return_type.c19
-rw-r--r--usr.bin/xlint/lint1/d_struct_init_nested.c83
-rw-r--r--usr.bin/xlint/lint1/d_type_conv1.c23
-rw-r--r--usr.bin/xlint/lint1/d_type_conv2.c23
-rw-r--r--usr.bin/xlint/lint1/d_type_conv3.c23
-rw-r--r--usr.bin/xlint/lint1/d_typename_as_var.c17
-rw-r--r--usr.bin/xlint/lint1/d_zero_sized_arrays.c6
-rw-r--r--usr.bin/xlint/lint1/decl.c110
-rw-r--r--usr.bin/xlint/lint1/decl_arg.c47
-rw-r--r--usr.bin/xlint/lint1/decl_direct_abstract.c13
-rw-r--r--usr.bin/xlint/lint1/decl_enum.c14
-rw-r--r--usr.bin/xlint/lint1/decl_struct_member.c6
-rw-r--r--usr.bin/xlint/lint1/emit.c11
-rw-r--r--usr.bin/xlint/lint1/emit.exp-ln6
-rw-r--r--usr.bin/xlint/lint1/expr_binary.c104
-rw-r--r--usr.bin/xlint/lint1/expr_cast.c49
-rw-r--r--usr.bin/xlint/lint1/expr_fold.c49
-rw-r--r--usr.bin/xlint/lint1/expr_fold_strict_bool.c11
-rw-r--r--usr.bin/xlint/lint1/expr_precedence.c8
-rw-r--r--usr.bin/xlint/lint1/expr_promote.c6
-rw-r--r--usr.bin/xlint/lint1/expr_promote.exp-ln10
-rw-r--r--usr.bin/xlint/lint1/expr_promote_trad.c18
-rw-r--r--usr.bin/xlint/lint1/expr_promote_trad.exp-ln10
-rw-r--r--usr.bin/xlint/lint1/expr_range.c6
-rw-r--r--usr.bin/xlint/lint1/expr_sizeof.c62
-rw-r--r--usr.bin/xlint/lint1/gcc_attribute_aligned.c19
-rw-r--r--usr.bin/xlint/lint1/gcc_attribute_enum.c22
-rw-r--r--usr.bin/xlint/lint1/gcc_attribute_func.c19
-rw-r--r--usr.bin/xlint/lint1/gcc_attribute_label.c6
-rw-r--r--usr.bin/xlint/lint1/gcc_attribute_var.c42
-rw-r--r--usr.bin/xlint/lint1/gcc_bit_field_types.c4
-rw-r--r--usr.bin/xlint/lint1/gcc_builtin_alloca.c4
-rw-r--r--usr.bin/xlint/lint1/gcc_typeof_after_statement.c20
-rw-r--r--usr.bin/xlint/lint1/init.c81
-rw-r--r--usr.bin/xlint/lint1/init_braces.c8
-rw-r--r--usr.bin/xlint/lint1/lang_level_c99.c57
-rw-r--r--usr.bin/xlint/lint1/lex_char.c18
-rw-r--r--usr.bin/xlint/lint1/lex_comment.c82
-rw-r--r--usr.bin/xlint/lint1/lex_integer_ilp32.c7
-rw-r--r--usr.bin/xlint/lint1/lex_wide_char.c6
-rw-r--r--usr.bin/xlint/lint1/lex_wide_string.c11
-rw-r--r--usr.bin/xlint/lint1/msg_003.c3
-rw-r--r--usr.bin/xlint/lint1/msg_004.c37
-rw-r--r--usr.bin/xlint/lint1/msg_005.c141
-rw-r--r--usr.bin/xlint/lint1/msg_006.c4
-rw-r--r--usr.bin/xlint/lint1/msg_008.c6
-rw-r--r--usr.bin/xlint/lint1/msg_011.c10
-rw-r--r--usr.bin/xlint/lint1/msg_014.c10
-rw-r--r--usr.bin/xlint/lint1/msg_015.c6
-rw-r--r--usr.bin/xlint/lint1/msg_016.c8
-rw-r--r--usr.bin/xlint/lint1/msg_018.c6
-rw-r--r--usr.bin/xlint/lint1/msg_019.c6
-rw-r--r--usr.bin/xlint/lint1/msg_021.c7
-rw-r--r--usr.bin/xlint/lint1/msg_022.c3
-rw-r--r--usr.bin/xlint/lint1/msg_030.c10
-rw-r--r--usr.bin/xlint/lint1/msg_032.c5
-rw-r--r--usr.bin/xlint/lint1/msg_035.c36
-rw-r--r--usr.bin/xlint/lint1/msg_036.c8
-rw-r--r--usr.bin/xlint/lint1/msg_038.c6
-rw-r--r--usr.bin/xlint/lint1/msg_039.c8
-rw-r--r--usr.bin/xlint/lint1/msg_044.c6
-rw-r--r--usr.bin/xlint/lint1/msg_045.c6
-rw-r--r--usr.bin/xlint/lint1/msg_047.c6
-rw-r--r--usr.bin/xlint/lint1/msg_051.c3
-rw-r--r--usr.bin/xlint/lint1/msg_052.c3
-rw-r--r--usr.bin/xlint/lint1/msg_053.c5
-rw-r--r--usr.bin/xlint/lint1/msg_056.c47
-rw-r--r--usr.bin/xlint/lint1/msg_058.c3
-rw-r--r--usr.bin/xlint/lint1/msg_062.c3
-rw-r--r--usr.bin/xlint/lint1/msg_063.c3
-rw-r--r--usr.bin/xlint/lint1/msg_068.c13
-rw-r--r--usr.bin/xlint/lint1/msg_070.c4
-rw-r--r--usr.bin/xlint/lint1/msg_074.c27
-rw-r--r--usr.bin/xlint/lint1/msg_075.c64
-rw-r--r--usr.bin/xlint/lint1/msg_076.c31
-rw-r--r--usr.bin/xlint/lint1/msg_077.c3
-rw-r--r--usr.bin/xlint/lint1/msg_079.c24
-rw-r--r--usr.bin/xlint/lint1/msg_080.c19
-rw-r--r--usr.bin/xlint/lint1/msg_081.c10
-rw-r--r--usr.bin/xlint/lint1/msg_082.c10
-rw-r--r--usr.bin/xlint/lint1/msg_083.c6
-rw-r--r--usr.bin/xlint/lint1/msg_084.c6
-rw-r--r--usr.bin/xlint/lint1/msg_086.c29
-rw-r--r--usr.bin/xlint/lint1/msg_087.c8
-rw-r--r--usr.bin/xlint/lint1/msg_088.c6
-rw-r--r--usr.bin/xlint/lint1/msg_090.c8
-rw-r--r--usr.bin/xlint/lint1/msg_092.c8
-rw-r--r--usr.bin/xlint/lint1/msg_094.c8
-rw-r--r--usr.bin/xlint/lint1/msg_095.c6
-rw-r--r--usr.bin/xlint/lint1/msg_097.c12
-rw-r--r--usr.bin/xlint/lint1/msg_098.c14
-rw-r--r--usr.bin/xlint/lint1/msg_100.c6
-rw-r--r--usr.bin/xlint/lint1/msg_102.c8
-rw-r--r--usr.bin/xlint/lint1/msg_105.c4
-rw-r--r--usr.bin/xlint/lint1/msg_107.c11
-rw-r--r--usr.bin/xlint/lint1/msg_109.c6
-rw-r--r--usr.bin/xlint/lint1/msg_111.c6
-rw-r--r--usr.bin/xlint/lint1/msg_116.c8
-rw-r--r--usr.bin/xlint/lint1/msg_117.c82
-rw-r--r--usr.bin/xlint/lint1/msg_118.c64
-rw-r--r--usr.bin/xlint/lint1/msg_120.c12
-rw-r--r--usr.bin/xlint/lint1/msg_123.c16
-rw-r--r--usr.bin/xlint/lint1/msg_124.c16
-rw-r--r--usr.bin/xlint/lint1/msg_125.c6
-rw-r--r--usr.bin/xlint/lint1/msg_126.c26
-rw-r--r--usr.bin/xlint/lint1/msg_127.c8
-rw-r--r--usr.bin/xlint/lint1/msg_128.c30
-rw-r--r--usr.bin/xlint/lint1/msg_129.c100
-rw-r--r--usr.bin/xlint/lint1/msg_130.c4
-rw-r--r--usr.bin/xlint/lint1/msg_132.c500
-rw-r--r--usr.bin/xlint/lint1/msg_132_lp64.c16
-rw-r--r--usr.bin/xlint/lint1/msg_135.c25
-rw-r--r--usr.bin/xlint/lint1/msg_138.c6
-rw-r--r--usr.bin/xlint/lint1/msg_141.c646
-rw-r--r--usr.bin/xlint/lint1/msg_142.c8
-rw-r--r--usr.bin/xlint/lint1/msg_153.c24
-rw-r--r--usr.bin/xlint/lint1/msg_154.c6
-rw-r--r--usr.bin/xlint/lint1/msg_157.c6
-rw-r--r--usr.bin/xlint/lint1/msg_161.c20
-rw-r--r--usr.bin/xlint/lint1/msg_162.c3
-rw-r--r--usr.bin/xlint/lint1/msg_164.c12
-rw-r--r--usr.bin/xlint/lint1/msg_165.c6
-rw-r--r--usr.bin/xlint/lint1/msg_166.c10
-rw-r--r--usr.bin/xlint/lint1/msg_167.c6
-rw-r--r--usr.bin/xlint/lint1/msg_168.c8
-rw-r--r--usr.bin/xlint/lint1/msg_169.c70
-rw-r--r--usr.bin/xlint/lint1/msg_174.c6
-rw-r--r--usr.bin/xlint/lint1/msg_177.c6
-rw-r--r--usr.bin/xlint/lint1/msg_182.c10
-rw-r--r--usr.bin/xlint/lint1/msg_183.c9
-rw-r--r--usr.bin/xlint/lint1/msg_184.c6
-rw-r--r--usr.bin/xlint/lint1/msg_186.c7
-rw-r--r--usr.bin/xlint/lint1/msg_187.c4
-rw-r--r--usr.bin/xlint/lint1/msg_188.c8
-rw-r--r--usr.bin/xlint/lint1/msg_189.c4
-rw-r--r--usr.bin/xlint/lint1/msg_192.c58
-rw-r--r--usr.bin/xlint/lint1/msg_193.c10
-rw-r--r--usr.bin/xlint/lint1/msg_196.c25
-rw-r--r--usr.bin/xlint/lint1/msg_199.c4
-rw-r--r--usr.bin/xlint/lint1/msg_200.c4
-rw-r--r--usr.bin/xlint/lint1/msg_205.c8
-rw-r--r--usr.bin/xlint/lint1/msg_207.c53
-rw-r--r--usr.bin/xlint/lint1/msg_211.c19
-rw-r--r--usr.bin/xlint/lint1/msg_217.c51
-rw-r--r--usr.bin/xlint/lint1/msg_218.c43
-rw-r--r--usr.bin/xlint/lint1/msg_219.c22
-rw-r--r--usr.bin/xlint/lint1/msg_220.c30
-rw-r--r--usr.bin/xlint/lint1/msg_221.c6
-rw-r--r--usr.bin/xlint/lint1/msg_222.c108
-rw-r--r--usr.bin/xlint/lint1/msg_231.c27
-rw-r--r--usr.bin/xlint/lint1/msg_236.c8
-rw-r--r--usr.bin/xlint/lint1/msg_238.c6
-rw-r--r--usr.bin/xlint/lint1/msg_239.c11
-rw-r--r--usr.bin/xlint/lint1/msg_244.c8
-rw-r--r--usr.bin/xlint/lint1/msg_246.c4
-rw-r--r--usr.bin/xlint/lint1/msg_247.c28
-rw-r--r--usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c856
-rw-r--r--usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c876
-rw-r--r--usr.bin/xlint/lint1/msg_247_portable.c892
-rw-r--r--usr.bin/xlint/lint1/msg_247_portable_int.c892
-rw-r--r--usr.bin/xlint/lint1/msg_249.c12
-rw-r--r--usr.bin/xlint/lint1/msg_252.c14
-rw-r--r--usr.bin/xlint/lint1/msg_253.c5
-rw-r--r--usr.bin/xlint/lint1/msg_254.c30
-rw-r--r--usr.bin/xlint/lint1/msg_255.c7
-rw-r--r--usr.bin/xlint/lint1/msg_258.c29
-rw-r--r--usr.bin/xlint/lint1/msg_259.c21
-rw-r--r--usr.bin/xlint/lint1/msg_262.c6
-rw-r--r--usr.bin/xlint/lint1/msg_263.c8
-rw-r--r--usr.bin/xlint/lint1/msg_264.c8
-rw-r--r--usr.bin/xlint/lint1/msg_266.c6
-rw-r--r--usr.bin/xlint/lint1/msg_267.c30
-rw-r--r--usr.bin/xlint/lint1/msg_270.c6
-rw-r--r--usr.bin/xlint/lint1/msg_273.c6
-rw-r--r--usr.bin/xlint/lint1/msg_274.c6
-rw-r--r--usr.bin/xlint/lint1/msg_276.c8
-rw-r--r--usr.bin/xlint/lint1/msg_277.c6
-rw-r--r--usr.bin/xlint/lint1/msg_285.c3
-rw-r--r--usr.bin/xlint/lint1/msg_286.c27
-rw-r--r--usr.bin/xlint/lint1/msg_287.c18
-rw-r--r--usr.bin/xlint/lint1/msg_296.c6
-rw-r--r--usr.bin/xlint/lint1/msg_298.c13
-rw-r--r--usr.bin/xlint/lint1/msg_303.c8
-rw-r--r--usr.bin/xlint/lint1/msg_304.c8
-rw-r--r--usr.bin/xlint/lint1/msg_305.c27
-rw-r--r--usr.bin/xlint/lint1/msg_306.c48
-rw-r--r--usr.bin/xlint/lint1/msg_308.c31
-rw-r--r--usr.bin/xlint/lint1/msg_309.c70
-rw-r--r--usr.bin/xlint/lint1/msg_322.c6
-rw-r--r--usr.bin/xlint/lint1/msg_324.c10
-rw-r--r--usr.bin/xlint/lint1/msg_333.c6
-rw-r--r--usr.bin/xlint/lint1/msg_338.c26
-rw-r--r--usr.bin/xlint/lint1/msg_339.c16
-rw-r--r--usr.bin/xlint/lint1/msg_341.c11
-rw-r--r--usr.bin/xlint/lint1/msg_343.c12
-rw-r--r--usr.bin/xlint/lint1/msg_346.c10
-rw-r--r--usr.bin/xlint/lint1/msg_348.c73
-rw-r--r--usr.bin/xlint/lint1/msg_349.c4
-rw-r--r--usr.bin/xlint/lint1/msg_350.c4
-rw-r--r--usr.bin/xlint/lint1/msg_351.c4
-rw-r--r--usr.bin/xlint/lint1/msg_352.c4
-rw-r--r--usr.bin/xlint/lint1/msg_353.c4
-rw-r--r--usr.bin/xlint/lint1/msg_354.c4
-rw-r--r--usr.bin/xlint/lint1/msg_355.c4
-rw-r--r--usr.bin/xlint/lint1/op_colon.c30
-rw-r--r--usr.bin/xlint/lint1/parse_type_name.c4
-rw-r--r--usr.bin/xlint/lint1/platform_ilp32.c36
-rw-r--r--usr.bin/xlint/lint1/platform_ilp32_int.c83
-rw-r--r--usr.bin/xlint/lint1/platform_ilp32_long.c91
-rw-r--r--usr.bin/xlint/lint1/platform_ldbl128.c3
-rw-r--r--usr.bin/xlint/lint1/platform_ldbl64.c3
-rw-r--r--usr.bin/xlint/lint1/platform_ldbl96.c3
-rw-r--r--usr.bin/xlint/lint1/platform_long.c9
-rw-r--r--usr.bin/xlint/lint1/platform_lp64.c127
-rw-r--r--usr.bin/xlint/lint1/platform_schar.c20
-rw-r--r--usr.bin/xlint/lint1/platform_uchar.c21
-rw-r--r--usr.bin/xlint/lint1/queries.c163
-rw-r--r--usr.bin/xlint/lint1/queries_schar.c22
-rw-r--r--usr.bin/xlint/lint1/queries_uchar.c34
-rw-r--r--usr.bin/xlint/lint1/t_integration.sh61
-rw-r--r--usr.bin/xlint/lint1/t_usage.sh14
-rw-r--r--usr.bin/xlint/lint2/emit.ln6
-rw-r--r--usr.bin/xlint/lint2/msg_000.exp4
-rw-r--r--usr.bin/xlint/lint2/msg_000.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_001.exp4
-rw-r--r--usr.bin/xlint/lint2/msg_001.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_002.exp4
-rw-r--r--usr.bin/xlint/lint2/msg_002.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_003.exp4
-rw-r--r--usr.bin/xlint/lint2/msg_003.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_004.exp12
-rw-r--r--usr.bin/xlint/lint2/msg_004.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_005.exp14
-rw-r--r--usr.bin/xlint/lint2/msg_005.ln13
-rw-r--r--usr.bin/xlint/lint2/msg_006.exp12
-rw-r--r--usr.bin/xlint/lint2/msg_006.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_007.exp3
-rw-r--r--usr.bin/xlint/lint2/msg_007.ln18
-rw-r--r--usr.bin/xlint/lint2/msg_008.exp2
-rw-r--r--usr.bin/xlint/lint2/msg_008.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_009.exp2
-rw-r--r--usr.bin/xlint/lint2/msg_009.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_010.exp2
-rw-r--r--usr.bin/xlint/lint2/msg_010.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_011.exp17
-rw-r--r--usr.bin/xlint/lint2/msg_011.ln18
-rw-r--r--usr.bin/xlint/lint2/msg_012.exp2
-rw-r--r--usr.bin/xlint/lint2/msg_012.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_013.exp6
-rw-r--r--usr.bin/xlint/lint2/msg_013.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_014.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_015.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_016.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_017.ln4
-rw-r--r--usr.bin/xlint/lint2/msg_018.ln4
-rw-r--r--usr.bin/xlint/lint2/output_sorted.exp54
-rw-r--r--usr.bin/xlint/lint2/read.exp30
-rw-r--r--usr.bin/xlint/lint2/read.ln6
-rw-r--r--usr.bin/xlint/xlint/t_xlint.sh9
-rw-r--r--usr.sbin/Makefile4
-rw-r--r--usr.sbin/cpuctl/t_cpuctl.sh6
-rw-r--r--usr.sbin/inetd/t_inetd.c34
-rw-r--r--usr.sbin/inetd/test_server.c16
-rw-r--r--usr.sbin/mtree/t_mtree.sh38
612 files changed, 23517 insertions, 18356 deletions
diff --git a/Makefile b/Makefile
index 14c04cbb571e..257a1c930f6d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.46 2017/05/21 15:28:42 riastradh Exp $
+# $NetBSD: Makefile,v 1.47 2023/08/19 22:56:43 christos Exp $
.include <bsd.own.mk>
@@ -6,7 +6,7 @@
TESTSDIR= ${TESTSBASE}
-TESTS_SUBDIRS= bin dev games include kernel lib libexec net
+TESTS_SUBDIRS= bin compat dev games include kernel lib libexec net
TESTS_SUBDIRS+= sbin sys usr.bin usr.sbin
. if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
diff --git a/bin/cat/t_cat.sh b/bin/cat/t_cat.sh
index 799a7485b080..6a4510ed3168 100644
--- a/bin/cat/t_cat.sh
+++ b/bin/cat/t_cat.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_cat.sh,v 1.3 2016/06/16 01:04:58 sevan Exp $
+# $NetBSD: t_cat.sh,v 1.4 2024/04/26 00:57:15 rillig Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -30,37 +30,37 @@
atf_test_case align
align_head() {
- atf_set "descr" "Test that cat(1) aligns the output " \
+ atf_set "descr" "Test that cat(1) aligns the output" \
"right with options '-be' (PR bin/4841)"
}
align_body() {
- atf_check -s ignore -o file:$(atf_get_srcdir)/d_align.out \
- -x "cat -be $(atf_get_srcdir)/d_align.in"
+ atf_check -o file:$(atf_get_srcdir)/d_align.out \
+ cat -be $(atf_get_srcdir)/d_align.in
}
atf_test_case nonexistent
nonexistent_head() {
- atf_set "descr" "Test that cat(1) doesn't return zero exit " \
+ atf_set "descr" "Test that cat(1) doesn't return zero exit" \
"status for a nonexistent file (PR bin/3538)"
}
nonexistent_body() {
- atf_check -s not-exit:0 -o empty -e not-empty \
- -x "cat /some/name/that/does/not/exist"
+ atf_check -s not-exit:0 -e not-empty \
+ cat /some/name/that/does/not/exist
}
atf_test_case se_output
se_output_head() {
- atf_set "descr" "Test that cat(1) prints a $ sign " \
+ atf_set "descr" "Test that cat(1) prints a $ sign" \
"on blank lines with options '-se' (PR bin/51250)"
}
se_output_body() {
- atf_check -s ignore -o file:$(atf_get_srcdir)/d_se_output.out \
- -x "cat -se $(atf_get_srcdir)/d_se_output.in"
+ atf_check -o file:$(atf_get_srcdir)/d_se_output.out \
+ cat -se $(atf_get_srcdir)/d_se_output.in
}
atf_init_test_cases()
diff --git a/bin/cp/t_cp.sh b/bin/cp/t_cp.sh
index be55c7cb0ef3..1a5b43834355 100644
--- a/bin/cp/t_cp.sh
+++ b/bin/cp/t_cp.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_cp.sh,v 1.1 2012/03/17 16:33:10 jruoho Exp $
+# $NetBSD: t_cp.sh,v 1.2 2024/04/26 01:33:23 rillig Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -62,7 +62,7 @@ file_to_file_simple() {
rm -f file2
umask 022
chmod 777 file
- atf_check -s eq:0 -o empty -e empty cp file file2
+ atf_check cp file file2
cp_compare file_to_file_simple file file2
if [ `stat -f "%Lp" file2` != "755" ]; then
atf_fail "new file not created with umask"
@@ -80,7 +80,7 @@ file_to_file_preserve() {
rm file3
chmod 644 file
chflags nodump file
- atf_check -s eq:0 -o empty -e empty cp -p file file3
+ atf_check cp -p file file3
finfo=`stat -f "%p%u%g%m%z%f" file`
f3info=`stat -f "%p%u%g%m%z%f" file3`
if [ $finfo != $f3info ]; then
@@ -92,7 +92,7 @@ file_to_file_noflags() {
rm file3
chmod 644 file
chflags nodump file
- atf_check -s eq:0 -o empty -e empty cp -p -N file file3
+ atf_check cp -p -N file file3
finfo=`stat -f "%f" file`
f3info=`stat -f "%f" file3`
if [ $finfo = $f3info ]; then
@@ -106,7 +106,7 @@ file_to_link_head() {
}
file_to_link_body() {
reset
- atf_check -s eq:0 -o empty -e empty cp file2 link
+ atf_check cp file2 link
cp_compare file_to_link file file2
}
@@ -117,8 +117,8 @@ link_to_file_head() {
link_to_file_body() {
reset
# file and link are identical (not copied).
- atf_check -s eq:1 -o empty -e ignore cp link file
- atf_check -s eq:0 -o empty -e empty cp link file2
+ atf_check -s exit:1 -e ignore cp link file
+ atf_check cp link file2
cp_compare link_to_file file file2
}
@@ -129,7 +129,7 @@ file_over_link_head() {
}
file_over_link_body() {
reset
- atf_check -s eq:0 -o empty -e empty cp -P file link
+ atf_check cp -P file link
cp_compare file_over_link file link
}
@@ -140,7 +140,7 @@ link_over_file_head() {
}
link_over_file_body() {
reset
- atf_check -s eq:0 -o empty -e empty cp -P link file
+ atf_check cp -P link file
if [ `readlink link` != `readlink file` ]; then
atf_fail "readlink link != readlink file"
fi
@@ -153,8 +153,8 @@ files_to_dir_head() {
files_to_dir_body() {
reset
# can't copy multiple files to a file
- atf_check -s eq:1 -o empty -e ignore cp file file2 file3
- atf_check -s eq:0 -o empty -e empty cp file file2 link dir
+ atf_check -s exit:1 -e ignore cp file file2 file3
+ atf_check cp file file2 link dir
cp_compare files_to_dir file "dir/file"
}
@@ -166,8 +166,8 @@ dir_to_file_head() {
dir_to_file_body() {
reset
# can't copy a dir onto a file
- atf_check -s eq:1 -o empty -e ignore cp dir file
- atf_check -s eq:1 -o empty -e ignore cp -R dir file
+ atf_check -s exit:1 -e ignore cp dir file
+ atf_check -s exit:1 -e ignore cp -R dir file
}
atf_test_case file_to_linkdir
@@ -177,12 +177,12 @@ file_to_linkdir_head() {
}
file_to_linkdir_body() {
reset
- atf_check -s eq:0 -o empty -e empty cp file dirlink
+ atf_check cp file dirlink
cp_compare file_to_linkdir file "dir/file"
# overwrite the link
- atf_check -s eq:0 -o empty -e empty cp -P file dirlink
- atf_check -s eq:1 -o empty -e empty readlink dirlink
+ atf_check cp -P file dirlink
+ atf_check -s exit:1 readlink dirlink
cp_compare file_to_linkdir file dirlink
}
@@ -194,21 +194,21 @@ linkdir_to_file_head() {
linkdir_to_file_body() {
reset
# cannot copy a dir onto a file
- atf_check -s eq:1 -o empty -e ignore cp dirlink file
+ atf_check -s exit:1 -e ignore cp dirlink file
# overwrite the link
- atf_check -s eq:0 -o empty -e empty cp -P dirlink file
+ atf_check cp -P dirlink file
if [ `readlink file` != `readlink dirlink` ]; then
atf_fail "readlink link != readlink file"
fi
}
dir_to_dne_no_R() {
- atf_check -s eq:1 -o empty -e ignore cp dir dir2
+ atf_check -s exit:1 -e ignore cp dir dir2
}
dir_to_dne() {
- atf_check -s eq:0 -o empty -e empty cp -R dir dir2
+ atf_check cp -R dir dir2
cp_compare dir_to_dne "dir/file" "dir2/file"
readlink dir2/link >/dev/null
if [ $? -gt 0 ]; then
@@ -218,12 +218,12 @@ dir_to_dne() {
dir_to_dir_H() {
dir_to_dir_setup
- atf_check -s eq:0 -o empty -e empty cp -R dir dir2
+ atf_check cp -R dir dir2
chmod 777 dir
# copy a dir into a dir, only command-line links are followed
- atf_check -s eq:0 -o empty -e empty cp -R -H dirlink dir2
+ atf_check cp -R -H dirlink dir2
cp_compare dir_to_dir_H "dir/file" "dir2/dirlink/file"
readlink dir2/dirlink/link >/dev/null
if [ $? -gt 0 ]; then
@@ -239,14 +239,14 @@ dir_to_dir_H() {
dir_to_dir_L() {
dir_to_dir_setup
- atf_check -s eq:0 -o empty -e empty cp -R dir dir2
- atf_check -s eq:0 -o empty -e empty cp -R -H dirlink dir2
+ atf_check cp -R dir dir2
+ atf_check cp -R -H dirlink dir2
# copy a dir into a dir, following all links
- atf_check -s eq:0 -o empty -e empty cp -R -H -L dirlink dir2/dirlink
+ atf_check cp -R -H -L dirlink dir2/dirlink
cp_compare dir_to_dir_L "dir/file" "dir2/dirlink/dirlink/file"
# fail if -R -L copied a link as a link
- atf_check -s eq:1 -o ignore -e empty readlink dir2/dirlink/dirlink/link
+ atf_check -s exit:1 -o ignore readlink dir2/dirlink/dirlink/link
}
dir_to_dir_subdir_exists() {
@@ -256,7 +256,7 @@ dir_to_dir_subdir_exists() {
mkdir -p dir/1 dir/2 dir/3 target/2
echo "file" > dir/2/file
- atf_check -s eq:0 -o empty -e empty cp -R dir/* target
+ atf_check cp -R dir/* target
cp_compare dir_to_dir_subdir_exists "dir/2/file" "target/2/file"
}
diff --git a/bin/dd/t_dd.sh b/bin/dd/t_dd.sh
index 92652d8a021a..e1b4ec32a3d9 100644
--- a/bin/dd/t_dd.sh
+++ b/bin/dd/t_dd.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_dd.sh,v 1.3 2022/05/24 21:42:37 rillig Exp $
+# $NetBSD: t_dd.sh,v 1.6 2026/01/26 07:28:13 kre Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,25 +25,30 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-test_dd_length() {
+test_dd_length()
+{
result=$1
cmd=$2
- set -- x `eval $cmd | wc -c`
- res=$2
- if [ x"$res" != x"$result" ]; then
+ res=$( set -o pipefail; eval "$cmd" | wc -c ) ||
+ atf_fail "Exit status $? from: $cmd"
+ res=$(( $res ))
+ if [ "$res" -ne "$result" ]
+ then
atf_fail "Expected $result bytes of output, got $res: $cmd"
fi
}
atf_test_case length
-length_head() {
+length_head()
+{
# XXX The PR should be stored in a tag.
atf_set "descr" "Test for result messages accidentally pumped into" \
- "the output file if the standard IO descriptors are" \
- "closed. The last of the three following tests is" \
- "the one expected to fail. (NetBSD PR bin/8521)"
+ "the output file if the standard IO descriptors are" \
+ "closed. The last of the three following tests is" \
+ "the one expected to fail. (NetBSD PR bin/8521)"
}
-length_body() {
+length_body()
+{
test_dd_length 512 \
"dd if=/dev/zero of=/dev/fd/5 count=1 5>&1 >/dev/null 2>/dev/null"
test_dd_length 512 \
@@ -52,27 +57,31 @@ length_body() {
"dd if=/dev/zero of=/dev/fd/5 count=1 5>&1 >&- 2>&-"
}
-test_dd_io() {
- res="`echo -n "$2" | eval $1`"
- if [ x"$res" != x"$3" ]; then
+test_dd_io()
+{
+ res=$(printf %s "$2" | eval "$1") || atf_fail "Non zero exit status ($?) from: $cmd"
+ if [ "$res" != "$3" ]
+ then
atf_fail "Expected \"$3\", got \"$res\": $1"
fi
}
-allbits1="\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377"
+allbits1='\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\040\041\042\043\044\045\046\047\050\051\052\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\072\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\134\135\136\137\140\141\142\143\144\145\146\147\150\151\152\153\154\155\156\157\160\161\162\163\164\165\166\167\170\171\172\173\174\175\176\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
-ebcdicbits1="\000\001\002\003\067\055\056\057\026\005\045\013\014\015\016\017\020\021\022\023\074\075\062\046\030\031\077\047\034\035\036\037\100\132\177\173\133\154\120\175\115\135\134\116\153\140\113\141\360\361\362\363\364\365\366\367\370\371\172\136\114\176\156\157\174\301\302\303\304\305\306\307\310\311\321\322\323\324\325\326\327\330\331\342\343\344\345\346\347\350\351\255\340\275\232\155\171\201\202\203\204\205\206\207\210\211\221\222\223\224\225\226\227\230\231\242\243\244\245\246\247\250\251\300\117\320\137\007\040\041\042\043\044\025\006\027\050\051\052\053\054\011\012\033\060\061\032\063\064\065\066\010\070\071\072\073\004\024\076\341\101\102\103\104\105\106\107\110\111\121\122\123\124\125\126\127\130\131\142\143\144\145\146\147\150\151\160\161\162\163\164\165\166\167\170\200\212\213\214\215\216\217\220\152\233\234\235\236\237\240\252\253\254\112\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\241\276\277\312\313\314\315\316\317\332\333\334\335\336\337\352\353\354\355\356\357\372\373\374\375\376\377"
+ebcdicbits1='\000\001\002\003\067\055\056\057\026\005\045\013\014\015\016\017\020\021\022\023\074\075\062\046\030\031\077\047\034\035\036\037\100\132\177\173\133\154\120\175\115\135\134\116\153\140\113\141\360\361\362\363\364\365\366\367\370\371\172\136\114\176\156\157\174\301\302\303\304\305\306\307\310\311\321\322\323\324\325\326\327\330\331\342\343\344\345\346\347\350\351\255\340\275\232\155\171\201\202\203\204\205\206\207\210\211\221\222\223\224\225\226\227\230\231\242\243\244\245\246\247\250\251\300\117\320\137\007\040\041\042\043\044\025\006\027\050\051\052\053\054\011\012\033\060\061\032\063\064\065\066\010\070\071\072\073\004\024\076\341\101\102\103\104\105\106\107\110\111\121\122\123\124\125\126\127\130\131\142\143\144\145\146\147\150\151\160\161\162\163\164\165\166\167\170\200\212\213\214\215\216\217\220\152\233\234\235\236\237\240\252\253\254\112\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\241\276\277\312\313\314\315\316\317\332\333\334\335\336\337\352\353\354\355\356\357\372\373\374\375\376\377'
-allvisbits=`echo -n "$allbits1" | unvis | vis`
-ebcdicvisbits=`echo -n "$ebcdicbits1" | unvis | vis`
+allvisbits=$(printf %s "$allbits1" | unvis | vis)
+ebcdicvisbits=$(printf %s "$ebcdicbits1" | unvis | vis)
atf_test_case io
-io_head() {
+io_head()
+{
atf_set "descr" "This checks the combination of bs= with" \
- "conv=ebcdic. Prior to revision 1.24 of dd's" \
- "args.c, the conv option would be ignored."
+ "conv=ebcdic. Prior to revision 1.24 of dd's" \
+ "args.c, the conv option would be ignored."
}
-io_body() {
+io_body()
+{
test_dd_io "unvis | dd 2>/dev/null | vis" \
"$allvisbits" "$allvisbits"
test_dd_io "unvis | dd ibs=1 2>/dev/null | vis" \
@@ -102,19 +111,21 @@ io_body() {
}
atf_test_case seek
-seek_head() {
+seek_head()
+{
atf_set "descr" "Tests output file seeking"
}
-seek_body() {
- echo TEST1234 > testfile
+seek_body()
+{
+ printf TEST1234\\n > testfile
atf_check -s exit:0 -e ignore \
dd if=/dev/zero of=testfile seek=1 bs=8k count=1
atf_check -s exit:0 -e ignore -o match:'^TEST1234$' dd if=testfile
eval $(stat -s testfile)
atf_check_equal $st_size $((2*8192))
- echo -n TEST1234 > tf2
+ printf TEST1234 > tf2
atf_check -s exit:0 -e ignore -x \
'dd bs=4 if=/dev/zero count=1 | tr \\0 \\n | dd of=tf2 bs=4 seek=1'
atf_check -s exit:0 -e ignore -o match:'^TEST$' dd if=tf2
@@ -123,14 +134,17 @@ seek_body() {
}
atf_test_case swab
-swab_head() {
+swab_head()
+{
atf_set "descr" "Tests conv=swab"
}
-swab_body() {
- echo -n abcdefgh > testfile
+swab_body()
+{
+ printf abcdefgh > testfile
- test_swab() {
+ test_swab()
+ {
atf_check -o inline:"$1" \
dd if=testfile conv=swab msgfmt=quiet $2
}
@@ -149,10 +163,50 @@ swab_body() {
test_swab badcfehg bs=8
}
+atf_test_case zerocount
+zerocount_head()
+{
+ atf_set descr "Test count=0, see PR bin/59942"
+}
+
+zerocount_body()
+{
+ test_dd_length 512 \
+ "{ dd if=/dev/zero bs=528 count=1 | \
+ { dd of=/dev/null bs=16 skip=1 count=0; dd; }; } 2>/dev/null"
+
+}
+
+atf_test_case zerocountextras
+zerocountextras_head()
+{
+ atf_set descr \
+ "Test more oddments that should work (or not) with count=0"
+}
+
+zerocountextras_body()
+{
+ rm -f FOOBAR
+ atf_check -o empty -e ignore -s exit:0 \
+ dd if=/dev/null bs=32 count=0 of=FOOBAR
+ test -e FOOBAR ||
+ atf_fail "output file not created with count=0"
+ test -s FOOBAR &&
+ atf_fail "output file not created empty with count=0"
+ rm -f FOOBAR
+
+ atf_check -o empty -e not-empty -s exit:1 \
+ dd if=/dev/zorro bs=32 count=0 of=FOOBAR
+ atf_check -o empty -e not-empty -s exit:1 \
+ dd if=/dev/null bs=32 count=0 frogs=green
+}
+
atf_init_test_cases()
{
atf_add_test_case length
atf_add_test_case io
atf_add_test_case seek
atf_add_test_case swab
+ atf_add_test_case zerocount
+ atf_add_test_case zerocountextras
}
diff --git a/bin/df/t_df.sh b/bin/df/t_df.sh
index d8ebc6063bb8..09cab19a4122 100644
--- a/bin/df/t_df.sh
+++ b/bin/df/t_df.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_df.sh,v 1.2 2020/08/23 15:51:30 ryo Exp $
+# $NetBSD: t_df.sh,v 1.4 2025/12/14 22:15:20 kre Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -34,52 +34,52 @@ normal_head() {
normal_body() {
cat >expout <<EOF
Filesystem 1K-blocks Used Avail %Cap Mounted on
-filer:/ 1202716672 135168 1202581504 0% /filer
+filer:/ 1202716672 135168 1202581504 1% /filer
filer:/ 1202716672 0 1202716672 0% /filer
-filer:/ 1202716672 240543334 962173337 20% /filer
-filer:/ 1202716672 721630003 481086668 60% /filer
-filer:/ 1202716672 1142580838 60135833 95% /filer
+filer:/ 1202716672 240543334 962173337 21% /filer
+filer:/ 1202716672 721630003 481086668 61% /filer
+filer:/ 1202716672 1142580838 60135833 96% /filer
filer:/ 1202716672 1202716672 0 100% /filer
filer:/ 1202716672 0 1142580838 0% /filer
-filer:/ 1202716672 240543334 902037504 21% /filer
-filer:/ 1202716672 721630003 420950835 63% /filer
+filer:/ 1202716672 240543334 902037504 22% /filer
+filer:/ 1202716672 721630003 420950835 64% /filer
filer:/ 1202716672 1142580838 0 100% /filer
-filer:/ 1202716672 1202716672 -60135833 105% /filer
+filer:/ 1202716672 1202716672 -60135833 106% /filer
filer:/ 1202716672 0 1082445004 0% /filer
-filer:/ 1202716672 240543334 841901670 22% /filer
-filer:/ 1202716672 721630003 360815001 66% /filer
-filer:/ 1202716672 1142580838 -60135833 105% /filer
-filer:/ 1202716672 1202716672 -120271667 111% /filer
+filer:/ 1202716672 240543334 841901670 23% /filer
+filer:/ 1202716672 721630003 360815001 67% /filer
+filer:/ 1202716672 1142580838 -60135833 106% /filer
+filer:/ 1202716672 1202716672 -120271667 112% /filer
filer:/ 1202716672 0 1022309171 0% /filer
-filer:/ 1202716672 240543334 781765836 23% /filer
-filer:/ 1202716672 721630003 300679168 70% /filer
-filer:/ 1202716672 1142580838 -120271667 111% /filer
-filer:/ 1202716672 1202716672 -180407500 117% /filer
-/dev/ld0g 1308726116 17901268 1225388540 1% /anon-root
+filer:/ 1202716672 240543334 781765836 24% /filer
+filer:/ 1202716672 721630003 300679168 71% /filer
+filer:/ 1202716672 1142580838 -120271667 112% /filer
+filer:/ 1202716672 1202716672 -180407500 118% /filer
+/dev/ld0g 1308726116 17901268 1225388540 2% /anon-root
/dev/ld0g 1308726116 0 1308726116 0% /anon-root
-/dev/ld0g 1308726116 261745224 1046980892 20% /anon-root
-/dev/ld0g 1308726116 785235672 523490444 60% /anon-root
-/dev/ld0g 1308726116 1243289812 65436304 95% /anon-root
+/dev/ld0g 1308726116 261745224 1046980892 21% /anon-root
+/dev/ld0g 1308726116 785235672 523490444 61% /anon-root
+/dev/ld0g 1308726116 1243289812 65436304 96% /anon-root
/dev/ld0g 1308726116 1308726116 0 100% /anon-root
/dev/ld0g 1308726116 0 1243289808 0% /anon-root
-/dev/ld0g 1308726116 261745224 981544584 21% /anon-root
-/dev/ld0g 1308726116 785235672 458054140 63% /anon-root
+/dev/ld0g 1308726116 261745224 981544584 22% /anon-root
+/dev/ld0g 1308726116 785235672 458054140 64% /anon-root
/dev/ld0g 1308726116 1243289812 0 100% /anon-root
-/dev/ld0g 1308726116 1308726116 -65436304 105% /anon-root
+/dev/ld0g 1308726116 1308726116 -65436304 106% /anon-root
/dev/ld0g 1308726116 0 1177853504 0% /anon-root
-/dev/ld0g 1308726116 261745224 916108280 22% /anon-root
-/dev/ld0g 1308726116 785235672 392617832 66% /anon-root
-/dev/ld0g 1308726116 1243289812 -65436304 105% /anon-root
-/dev/ld0g 1308726116 1308726116 -130872608 111% /anon-root
+/dev/ld0g 1308726116 261745224 916108280 23% /anon-root
+/dev/ld0g 1308726116 785235672 392617832 67% /anon-root
+/dev/ld0g 1308726116 1243289812 -65436304 106% /anon-root
+/dev/ld0g 1308726116 1308726116 -130872608 112% /anon-root
/dev/ld0g 1308726116 0 1112417196 0% /anon-root
-/dev/ld0g 1308726116 261745224 850671972 23% /anon-root
-/dev/ld0g 1308726116 785235672 327181528 70% /anon-root
-/dev/ld0g 1308726116 1243289812 -130872608 111% /anon-root
-/dev/ld0g 1308726116 1308726116 -196308916 117% /anon-root
-/dev/strpct 21474836476 10737418240 10737418236 50% /strpct
-/dev/wd0e 10485688 2859932 7625756 27% /mount/windows/C
+/dev/ld0g 1308726116 261745224 850671972 24% /anon-root
+/dev/ld0g 1308726116 785235672 327181528 71% /anon-root
+/dev/ld0g 1308726116 1243289812 -130872608 112% /anon-root
+/dev/ld0g 1308726116 1308726116 -196308916 118% /anon-root
+/dev/strpct 21474836476 10737418240 10737418236 51% /strpct
+/dev/wd0e 10485688 2859932 7625756 28% /mount/windows/C
EOF
- atf_check -s eq:0 -o file:expout -e empty \
+ atf_check -s exit:0 -o file:expout -e empty \
-x "BLOCKSIZE=1k $(atf_get_srcdir)/h_df -n"
}
@@ -92,52 +92,52 @@ hflag_head() {
hflag_body() {
cat >expout <<EOF
Filesystem Size Used Avail %Cap Mounted on
-filer:/ 1.1T 132M 1.1T 0% /filer
+filer:/ 1.1T 132M 1.1T 1% /filer
filer:/ 1.1T 0B 1.1T 0% /filer
-filer:/ 1.1T 229G 918G 20% /filer
-filer:/ 1.1T 688G 459G 60% /filer
-filer:/ 1.1T 1.1T 57G 95% /filer
+filer:/ 1.1T 229G 918G 21% /filer
+filer:/ 1.1T 688G 459G 61% /filer
+filer:/ 1.1T 1.1T 57G 96% /filer
filer:/ 1.1T 1.1T 0B 100% /filer
filer:/ 1.1T 0B 1.1T 0% /filer
-filer:/ 1.1T 229G 860G 21% /filer
-filer:/ 1.1T 688G 401G 63% /filer
+filer:/ 1.1T 229G 860G 22% /filer
+filer:/ 1.1T 688G 401G 64% /filer
filer:/ 1.1T 1.1T 0B 100% /filer
-filer:/ 1.1T 1.1T -57G 105% /filer
+filer:/ 1.1T 1.1T -57G 106% /filer
filer:/ 1.1T 0B 1.0T 0% /filer
-filer:/ 1.1T 229G 803G 22% /filer
-filer:/ 1.1T 688G 344G 66% /filer
-filer:/ 1.1T 1.1T -57G 105% /filer
-filer:/ 1.1T 1.1T -115G 111% /filer
+filer:/ 1.1T 229G 803G 23% /filer
+filer:/ 1.1T 688G 344G 67% /filer
+filer:/ 1.1T 1.1T -57G 106% /filer
+filer:/ 1.1T 1.1T -115G 112% /filer
filer:/ 1.1T 0B 975G 0% /filer
-filer:/ 1.1T 229G 746G 23% /filer
-filer:/ 1.1T 688G 287G 70% /filer
-filer:/ 1.1T 1.1T -115G 111% /filer
-filer:/ 1.1T 1.1T -172G 117% /filer
-/dev/ld0g 1.2T 17G 1.1T 1% /anon-root
+filer:/ 1.1T 229G 746G 24% /filer
+filer:/ 1.1T 688G 287G 71% /filer
+filer:/ 1.1T 1.1T -115G 112% /filer
+filer:/ 1.1T 1.1T -172G 118% /filer
+/dev/ld0g 1.2T 17G 1.1T 2% /anon-root
/dev/ld0g 1.2T 0B 1.2T 0% /anon-root
-/dev/ld0g 1.2T 250G 998G 20% /anon-root
-/dev/ld0g 1.2T 749G 499G 60% /anon-root
-/dev/ld0g 1.2T 1.2T 62G 95% /anon-root
+/dev/ld0g 1.2T 250G 998G 21% /anon-root
+/dev/ld0g 1.2T 749G 499G 61% /anon-root
+/dev/ld0g 1.2T 1.2T 62G 96% /anon-root
/dev/ld0g 1.2T 1.2T 0B 100% /anon-root
/dev/ld0g 1.2T 0B 1.2T 0% /anon-root
-/dev/ld0g 1.2T 250G 936G 21% /anon-root
-/dev/ld0g 1.2T 749G 437G 63% /anon-root
+/dev/ld0g 1.2T 250G 936G 22% /anon-root
+/dev/ld0g 1.2T 749G 437G 64% /anon-root
/dev/ld0g 1.2T 1.2T 0B 100% /anon-root
-/dev/ld0g 1.2T 1.2T -62G 105% /anon-root
+/dev/ld0g 1.2T 1.2T -62G 106% /anon-root
/dev/ld0g 1.2T 0B 1.1T 0% /anon-root
-/dev/ld0g 1.2T 250G 874G 22% /anon-root
-/dev/ld0g 1.2T 749G 374G 66% /anon-root
-/dev/ld0g 1.2T 1.2T -62G 105% /anon-root
-/dev/ld0g 1.2T 1.2T -125G 111% /anon-root
+/dev/ld0g 1.2T 250G 874G 23% /anon-root
+/dev/ld0g 1.2T 749G 374G 67% /anon-root
+/dev/ld0g 1.2T 1.2T -62G 106% /anon-root
+/dev/ld0g 1.2T 1.2T -125G 112% /anon-root
/dev/ld0g 1.2T 0B 1.0T 0% /anon-root
-/dev/ld0g 1.2T 250G 811G 23% /anon-root
-/dev/ld0g 1.2T 749G 312G 70% /anon-root
-/dev/ld0g 1.2T 1.2T -125G 111% /anon-root
-/dev/ld0g 1.2T 1.2T -187G 117% /anon-root
-/dev/strpct 20T 10T 10T 50% /strpct
-/dev/wd0e 10G 2.7G 7.3G 27% /mount/windows/C
+/dev/ld0g 1.2T 250G 811G 24% /anon-root
+/dev/ld0g 1.2T 749G 312G 71% /anon-root
+/dev/ld0g 1.2T 1.2T -125G 112% /anon-root
+/dev/ld0g 1.2T 1.2T -187G 118% /anon-root
+/dev/strpct 20T 10T 10T 51% /strpct
+/dev/wd0e 10G 2.7G 7.3G 28% /mount/windows/C
EOF
- atf_check -s eq:0 -o file:expout -e empty \
+ atf_check -s exit:0 -o file:expout -e empty \
-x "BLOCKSIZE=1k $(atf_get_srcdir)/h_df -hn"
}
diff --git a/bin/expr/t_expr.sh b/bin/expr/t_expr.sh
index 7349c6981709..56068c5c1329 100644
--- a/bin/expr/t_expr.sh
+++ b/bin/expr/t_expr.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_expr.sh,v 1.7 2023/05/02 00:11:27 gutteridge Exp $
+# $NetBSD: t_expr.sh,v 1.17 2025/06/29 00:24:23 rillig Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -25,15 +25,28 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-# The first arg will get eval'd so escape any meta characters
-# The 2nd arg is an expected string/response from expr for that op.
+: "${expr_prog:=expr}"
+
+# usage: test_expr operand ... result|error
test_expr() {
- echo "Expression '${1}', expecting '${2}'"
- res=`eval expr $1 2>&1`
- if [ "$res" != "$2" ]; then
- atf_fail "Expected $2, got $res from expression: " \
- "`eval echo $1`"
- fi
+ i=1
+ while [ $i -lt $# ]; do
+ i=$((i + 1))
+ set -- "$@" "$1"
+ shift
+ done
+ expected="$1"
+ shift
+
+ # shellcheck disable=SC2003
+ actual=$("$expr_prog" "$@" 2>&1 || :)
+
+ printf "%s => '%s'\n" "$*" "$expected" >> expected
+ printf "%s => '%s'\n" "$*" "$actual" >> actual
+}
+
+test_finish() {
+ atf_check -o file:expected cat actual
}
atf_test_case lang
@@ -41,12 +54,13 @@ lang_head() {
atf_set "descr" "Test that expr(1) works with non-C LANG (PR bin/2486)"
}
lang_body() {
+ # When setlocale fails, ensure that no error message is printed,
+ # like for most other utilities.
- export LANG=nonexistent
- atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11"
-
- export LANG=ru_RU.KOI8-R
- atf_check -s exit:0 -o inline:"21\n" -e empty -x "expr 10 + 11"
+ atf_check -o inline:"21\n" \
+ env LANG=nonexistent "$expr_prog" 10 + 11
+ atf_check -o inline:"21\n" \
+ env LANG=ru_RU.KOI8-R "$expr_prog" 10 + 11
}
atf_test_case overflow
@@ -54,94 +68,83 @@ overflow_head() {
atf_set "descr" "Test overflow cases"
}
overflow_body() {
- test_expr '4611686018427387904 + 4611686018427387903' \
+ test_expr 4611686018427387904 + 4611686018427387903 \
'9223372036854775807'
- test_expr '4611686018427387904 + 4611686018427387904' \
+ test_expr 4611686018427387904 + 4611686018427387904 \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 + 4611686018427387904'"
- test_expr '4611686018427387904 - -4611686018427387904' \
+ test_expr 4611686018427387904 - -4611686018427387904 \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 - -4611686018427387904'"
- test_expr '-4611686018427387904 - 4611686018427387903' \
+ test_expr -4611686018427387904 - 4611686018427387903 \
'-9223372036854775807'
- test_expr '-4611686018427387904 - 4611686018427387905' \
+ test_expr -4611686018427387904 - 4611686018427387905 \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 - 4611686018427387905'"
- test_expr '-4611686018427387904 \* 1' '-4611686018427387904'
- test_expr '-4611686018427387904 \* -1' '4611686018427387904'
- test_expr '-4611686018427387904 \* 2' '-9223372036854775808'
- test_expr '-4611686018427387904 \* 3' \
+ test_expr -4611686018427387904 \* 1 '-4611686018427387904'
+ test_expr -4611686018427387904 \* -1 '4611686018427387904'
+ test_expr -4611686018427387904 \* 2 '-9223372036854775808'
+ test_expr -4611686018427387904 \* 3 \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 * 3'"
- test_expr '-4611686018427387904 \* -2' \
+ test_expr -4611686018427387904 \* -2 \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -2'"
- test_expr '4611686018427387904 \* 1' '4611686018427387904'
- test_expr '4611686018427387904 \* 2' \
+ test_expr 4611686018427387904 \* 1 '4611686018427387904'
+ test_expr 4611686018427387904 \* 2 \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 * 2'"
- test_expr '4611686018427387904 \* 3' \
+ test_expr 4611686018427387904 \* 3 \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 * 3'"
- test_expr '-9223372036854775808 % -1' \
+ test_expr -9223372036854775808 % -1 \
"expr: integer overflow or underflow occurred for operation '-9223372036854775808 % -1'"
- test_expr '-9223372036854775808 / -1' \
+ test_expr -9223372036854775808 / -1 \
"expr: integer overflow or underflow occurred for operation '-9223372036854775808 / -1'"
- test_expr '0 + -9223372036854775808' '-9223372036854775808'
- test_expr '0 + -1' '-1'
- test_expr '0 + 0' '0'
- test_expr '0 + 1' '1'
- test_expr '0 + 9223372036854775807' '9223372036854775807'
- test_expr '-9223372036854775808 + 0' '-9223372036854775808'
- test_expr '9223372036854775807 + 0' '9223372036854775807'
- test_expr '4611686018427387904 \* -1' '-4611686018427387904'
- test_expr '4611686018427387904 \* -2' '-9223372036854775808'
- test_expr '4611686018427387904 \* -3' \
+ test_expr 0 + -9223372036854775808 '-9223372036854775808'
+ test_expr 0 + -1 '-1'
+ test_expr 0 + 0 '0'
+ test_expr 0 + 1 '1'
+ test_expr 0 + 9223372036854775807 '9223372036854775807'
+ test_expr -9223372036854775808 + 0 '-9223372036854775808'
+ test_expr 9223372036854775807 + 0 '9223372036854775807'
+ test_expr 4611686018427387904 \* -1 '-4611686018427387904'
+ test_expr 4611686018427387904 \* -2 '-9223372036854775808'
+ test_expr 4611686018427387904 \* -3 \
"expr: integer overflow or underflow occurred for operation '4611686018427387904 * -3'"
- test_expr '-4611686018427387904 \* -1' '4611686018427387904'
- test_expr '-4611686018427387904 \* -2' \
+ test_expr -4611686018427387904 \* -1 '4611686018427387904'
+ test_expr -4611686018427387904 \* -2 \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -2'"
- test_expr '-4611686018427387904 \* -3' \
+ test_expr -4611686018427387904 \* -3 \
"expr: integer overflow or underflow occurred for operation '-4611686018427387904 * -3'"
- test_expr '0 \* -1' '0'
- test_expr '0 \* 0' '0'
- test_expr '0 \* 1' '0'
+ test_expr 0 \* -1 '0'
+ test_expr 0 \* 0 '0'
+ test_expr 0 \* 1 '0'
+
+ test_finish
}
atf_test_case gtkmm
gtkmm_head() {
- atf_set "descr" "Test from gtk-- configure that cause problems on old expr"
+ atf_set "descr" "Tests from gtk-- configure that cause problems on old expr"
}
gtkmm_body() {
- test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1'
- test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '0'
- test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 3 \& 5 \>= 5' '0'
- test_expr '3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 2 \& 4 = 4 \& 5 \>= 5' '0'
- test_expr '3 \> 2 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6' '1'
- test_expr '3 \> 3 \| 3 = 3 \& 4 \> 3 \| 3 = 3 \& 4 = 4 \& 5 \>= 5' '1'
-}
+ test_expr 3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 5 '1'
+ test_expr 3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6 '0'
+ test_expr 3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 3 \& 5 \>= 5 '0'
+ test_expr 3 \> 3 \| 3 = 3 \& 4 \> 4 \| 3 = 2 \& 4 = 4 \& 5 \>= 5 '0'
+ test_expr 3 \> 2 \| 3 = 3 \& 4 \> 4 \| 3 = 3 \& 4 = 4 \& 5 \>= 6 '1'
+ test_expr 3 \> 3 \| 3 = 3 \& 4 \> 3 \| 3 = 3 \& 4 = 4 \& 5 \>= 5 '1'
-atf_test_case colon_vs_math
-colon_vs_math_head() {
- atf_set "descr" "Basic precendence test with the : operator vs. math"
-}
-colon_vs_math_body() {
- test_expr '2 : 4 / 2' '0'
- test_expr '4 : 4 % 3' '1'
+ test_finish
}
atf_test_case arithmetic_ops
arithmetic_ops_head() {
- atf_set "descr" "Dangling arithemtic operator"
+ atf_set "descr" "Dangling arithmetic operator"
}
arithmetic_ops_body() {
- test_expr '.java_wrapper : /' '0'
- test_expr '4 : \*' '0'
- test_expr '4 : +' '0'
- test_expr '4 : -' '0'
- test_expr '4 : /' '0'
- test_expr '4 : %' '0'
-}
+ test_expr .java_wrapper : / '0'
+ test_expr 4 : \* '0'
+ test_expr 4 : + '0'
+ test_expr 4 : - '0'
+ test_expr 4 : / '0'
+ test_expr 4 : % '0'
-atf_test_case basic_math
-basic_math_head() {
- atf_set "descr" "Basic math test"
-}
-basic_math_body() {
- test_expr '2 + 4 \* 5' '22'
+ test_finish
}
atf_test_case basic_functional
@@ -149,17 +152,25 @@ basic_functional_head() {
atf_set "descr" "Basic functional tests"
}
basic_functional_body() {
- test_expr '2' '2'
- test_expr '-4' '-4'
- test_expr 'hello' 'hello'
-}
+ test_expr 2 '2'
+ test_expr -4 '-4'
+ test_expr hello 'hello'
+ test_expr -- double-dash 'double-dash'
+ test_expr -- -- -- six-dashes 'expr: syntax error'
+ test_expr 3 -- + 4 'expr: syntax error'
+ test_expr 0000005 '0000005'
+ test_expr 0 + 0000005 '5'
-atf_test_case compare_ops_precedence
-compare_ops_precedence_head() {
- atf_set "descr" "Compare operator precendence test"
-}
-compare_ops_precedence_body() {
- test_expr '2 \> 1 \* 17' '0'
+ test_expr 111 \& 222 \& 333 '111'
+ test_expr 111 \& 222 \& 0 '0'
+
+ test_expr 1111 \| 2222 '1111'
+ test_expr 1111 \| 00 '1111'
+ test_expr 0000 \| 2222 '2222'
+ test_expr 0000 \| 00 '00'
+ test_expr 0000 \| '' '0'
+
+ test_finish
}
atf_test_case compare_ops
@@ -167,20 +178,22 @@ compare_ops_head() {
atf_set "descr" "Compare operator tests"
}
compare_ops_body() {
- test_expr '2 \!= 5' '1'
- test_expr '2 \!= 2' '0'
- test_expr '2 \<= 3' '1'
- test_expr '2 \<= 2' '1'
- test_expr '2 \<= 1' '0'
- test_expr '2 \< 3' '1'
- test_expr '2 \< 2' '0'
- test_expr '2 = 2' '1'
- test_expr '2 = 4' '0'
- test_expr '2 \>= 1' '1'
- test_expr '2 \>= 2' '1'
- test_expr '2 \>= 3' '0'
- test_expr '2 \> 1' '1'
- test_expr '2 \> 2' '0'
+ test_expr 2 \!= 5 '1'
+ test_expr 2 \!= 2 '0'
+ test_expr 2 \<= 3 '1'
+ test_expr 2 \<= 2 '1'
+ test_expr 2 \<= 1 '0'
+ test_expr 2 \< 3 '1'
+ test_expr 2 \< 2 '0'
+ test_expr 2 = 2 '1'
+ test_expr 2 = 4 '0'
+ test_expr 2 \>= 1 '1'
+ test_expr 2 \>= 2 '1'
+ test_expr 2 \>= 3 '0'
+ test_expr 2 \> 1 '1'
+ test_expr 2 \> 2 '0'
+
+ test_finish
}
atf_test_case multiply
@@ -188,8 +201,10 @@ multiply_head() {
atf_set "descr" "Test the multiply operator (PR bin/12838)"
}
multiply_body() {
- test_expr '1 \* -1' '-1'
- test_expr '2 \> 1 \* 17' '0'
+ test_expr 1 \* -1 '-1'
+ test_expr 2 \> 1 \* 17 '0'
+
+ test_finish
}
atf_test_case negative
@@ -197,30 +212,45 @@ negative_head() {
atf_set "descr" "Test the additive inverse"
}
negative_body() {
- test_expr '-1 + 5' '4'
- test_expr '- 1 + 5' 'expr: syntax error'
+ test_expr -1 + 5 '4'
+ test_expr - 1 + 5 'expr: syntax error'
- test_expr '5 + -1' '4'
- test_expr '5 + - 1' 'expr: syntax error'
+ test_expr 5 + -1 '4'
+ test_expr 5 + - 1 'expr: syntax error'
- test_expr '1 - -5' '6'
-}
+ test_expr 1 - -5 '6'
-atf_test_case math_precedence
-math_precedence_head() {
- atf_set "descr" "More complex math test for precedence"
-}
-math_precedence_body() {
- test_expr '-3 + -1 \* 4 + 3 / -6' '-7'
+ test_finish
}
atf_test_case precedence
precedence_head() {
- atf_set "descr" "Test precedence"
+ atf_set "descr" "Tests for operator precedence"
}
precedence_body() {
- # This is messy but the shell escapes cause that
- test_expr 'X1/2/3 : X\\\(.\*[^/]\\\)//\*[^/][^/]\*/\*$ \| . : \\\(.\\\)' '1/2'
+ test_expr or \| '' \& and 'or'
+ test_expr '' \& and \| or 'or'
+ test_expr X1/2/3 : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| . : '\(.\)' '1/2'
+ test_expr and \& 001 = 00001 'and'
+ test_expr 001 = 00001 \& and '1'
+ test_expr 1 = 2 = 3 = 4 = 5 '0'
+ test_expr 1 = 2 = 3 = 4 = 0 '1'
+ test_expr 2 \> 1 \* 17 '0'
+ test_expr 900 + 101 = 1000 + 1 '1'
+ test_expr 1000 - 101 = 900 - 1 '1'
+ test_expr 1 + 100 - 10 + 1000 '1091'
+ test_expr 50 + 3 \* 4 + 80 '142'
+ test_expr 12345 / 1000 \* 1000 '12000'
+ test_expr 12345 % 1000 / 10 '34'
+ test_expr 2 : 4 / 2 '0'
+ test_expr 4 : 4 % 3 '1'
+ test_expr 6 \* 1111100 : 1\* '30'
+ test_expr -3 + -1 \* 4 + 3 / -6 '-7'
+ test_expr 10 \* \( 3 + 5 \) '80'
+ test_expr length 123456 : '\([1236]*\)' '6'
+ test_expr length \( 123456 : '\([1236]*\)' \) '3'
+
+ test_finish
}
atf_test_case regex
@@ -228,8 +258,46 @@ regex_head() {
atf_set "descr" "Test proper () returning \1 from a regex"
}
regex_body() {
- # This is messy but the shell escapes cause that
- test_expr '1/2 : .\*/\\\(.\*\\\)' '2'
+ test_expr 1/2 : '.*/\(.*\)' '2'
+
+ LC_ALL=en_US.UTF-8 test_expr aaaäää : '.*' '6'
+ LC_ALL=C test_expr aaaäää : '.*' '9'
+
+ test_finish
+}
+
+atf_test_case short_circuit
+short_circuit_head() {
+ atf_set "descr" "Test short-circuit evaluation of '|' and '&'"
+}
+short_circuit_body() {
+ test_expr 0 \| 1 / 0 "expr: second argument to '/' must not be zero"
+ test_expr 123 \| 1 / 0 '123'
+ test_expr 123 \| a : '***' '123'
+
+ test_expr 0 \& 1 / 0 '0'
+ test_expr 0 \& a : '***' '0'
+ test_expr 123 \& 1 / 0 "expr: second argument to '/' must not be zero"
+
+ test_finish
+}
+
+atf_test_case string_length
+string_length_head() {
+ atf_set "descr" "Test the string length operator"
+}
+string_length_body() {
+ # The 'length' operator is an extension to POSIX 2024.
+ test_expr length "" '0'
+ test_expr length + 'expr: syntax error'
+ test_expr length \! '1'
+ test_expr length ++ '2'
+ test_expr length length '6'
+
+ LC_ALL=en_US.UTF-8 test_expr length aaaäää '6'
+ LC_ALL=C test_expr length aaaäää '9'
+
+ test_finish
}
atf_init_test_cases()
@@ -237,15 +305,13 @@ atf_init_test_cases()
atf_add_test_case lang
atf_add_test_case overflow
atf_add_test_case gtkmm
- atf_add_test_case colon_vs_math
atf_add_test_case arithmetic_ops
- atf_add_test_case basic_math
atf_add_test_case basic_functional
- atf_add_test_case compare_ops_precedence
atf_add_test_case compare_ops
atf_add_test_case multiply
atf_add_test_case negative
- atf_add_test_case math_precedence
atf_add_test_case precedence
atf_add_test_case regex
+ atf_add_test_case short_circuit
+ atf_add_test_case string_length
}
diff --git a/bin/pax/t_pax.sh b/bin/pax/t_pax.sh
index 63ae7f8965ce..d959d0c6c6d3 100644
--- a/bin/pax/t_pax.sh
+++ b/bin/pax/t_pax.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_pax.sh,v 1.1 2012/03/17 16:33:11 jruoho Exp $
+# $NetBSD: t_pax.sh,v 1.9 2025/08/19 13:44:24 christos Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,20 +35,114 @@ append_body() {
touch foo bar
# store both foo and bar into file1.tar
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
pax -w -b 512 -x ustar -f file1.tar foo bar
# store foo into file2.tar, then append bar to file2.tar
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
pax -w -b 512 -x ustar -f file2.tar foo
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
pax -w -b 512 -x ustar -f file2.tar -a bar
# ensure that file1.tar and file2.tar are equal
- atf_check -s eq:0 -o empty -e empty cmp file1.tar file2.tar
+ atf_check -s exit:0 -o empty -e empty cmp file1.tar file2.tar
+}
+
+atf_test_case pr41736
+pr41736_head()
+{
+ atf_set "descr" "Test pax exits with 0 if stdin file list is empty"
+}
+pr41736_body()
+{
+ atf_check pax -rw . </dev/null
+}
+
+atf_test_case pr44498
+pr44498_head()
+{
+ atf_set "descr" "Ensure pax list operation works without getcwd"
+ atf_set "require.user" "unprivileged"
+}
+pr44498_body()
+{
+ mkdir foo foo/bar baz
+ chmod 111 foo
+ touch baz/quux
+ atf_check pax -w -x ustar -f baz.tar baz
+ atf_check -o 'inline:baz\nbaz/quux\n' \
+ sh -c '{ cd foo/bar && exec pax; } <baz.tar'
+}
+
+atf_test_case pr44498_copy
+pr44498_copy_head()
+{
+ atf_set "descr" \
+ "Ensure pax insecure copy operation works without getcwd"
+ atf_set "require.user" "unprivileged"
+}
+pr44498_copy_body()
+{
+ mkdir foo foo/bar foo/bar/baz
+ chmod 111 foo
+ touch foo/bar/quux
+ atf_check sh -c '{ cd foo/bar && exec pax -rw quux baz/.; }'
+}
+
+atf_test_case pr44498_insecureextract
+pr44498_insecureextract_head()
+{
+ atf_set "descr" \
+ "Ensure pax insecure extract operation works without getcwd"
+ atf_set "require.user" "unprivileged"
+}
+pr44498_insecureextract_body()
+{
+ mkdir foo foo/bar baz
+ chmod 111 foo
+ touch baz/quux
+ atf_check pax -w -x ustar -f baz.tar baz
+ atf_check sh -c '{ cd foo/bar && exec pax -r --insecure; } <baz.tar'
+}
+
+atf_test_case pr44498_listwd
+pr44498_listwd_head()
+{
+ atf_set "descr" "Ensure pax list operation works without working dir"
+ atf_set "require.user" "unprivileged"
+}
+pr44498_listwd_body()
+{
+ mkdir foo baz
+ chmod 111 foo
+ touch baz/quux
+ atf_check pax -w -x ustar -f baz.tar baz
+ atf_check -o 'inline:baz\nbaz/quux\n' \
+ sh -c '{ cd foo && exec pax; } <baz.tar'
+}
+
+atf_test_case pr44498_write
+pr44498_write_head()
+{
+ atf_set "descr" "Ensure pax write operation works without getcwd"
+ atf_set "require.user" "unprivileged"
+}
+pr44498_write_body()
+{
+ mkdir foo foo/bar
+ touch foo/bar/quux
+ chmod 111 foo
+ atf_check sh -c '{ cd foo/bar && pax -w -x ustar .; } >bar.tar'
+ atf_check -o 'inline:.\n./quux\n' pax -f bar.tar
}
atf_init_test_cases()
{
atf_add_test_case append
+ atf_add_test_case pr41736
+ atf_add_test_case pr44498
+ atf_add_test_case pr44498_copy
+ atf_add_test_case pr44498_insecureextract
+ atf_add_test_case pr44498_listwd
+ atf_add_test_case pr44498_write
}
diff --git a/bin/sh/t_arith.sh b/bin/sh/t_arith.sh
index 1400fb550f92..3623c8c6b764 100644
--- a/bin/sh/t_arith.sh
+++ b/bin/sh/t_arith.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_arith.sh,v 1.8 2017/07/15 18:50:42 kre Exp $
+# $NetBSD: t_arith.sh,v 1.10 2025/12/13 08:11:18 kre Exp $
#
# Copyright (c) 2016 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -961,7 +961,7 @@ optional_comma_body()
# Note ',' should be set off from numbers by spaces, as in some
- # locales it is a valid chacacter in a number, and we want to
+ # locales it is a valid character in a number, and we want to
# avoid any possibility of confusing the parser.
atf_check -s exit:0 -o inline:'2\n' -e empty ${TEST_SH} -c \
@@ -971,6 +971,17 @@ optional_comma_body()
atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
'echo $(( 1 , 2 , 3 , 4 ))'
+ # Check some expressions associated with ',' operators
+
+ atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
+ 'echo $(( 2*3 , 7/5 , (1 , 5) , 2 + 2 ))'
+ atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
+ 'echo $(( 173 , 3 ? 7 : 2 , 2 * 2 ))'
+ atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
+ 'echo $(( i = 2 , i += 1 , i + 1 ))'
+ atf_check -s exit:0 -o inline:'4\n' -e empty ${TEST_SH} -c \
+ 'echo $(( ( 0 , 3 ) ? 7 , 8 / 2 : ( 11 , 13 ) ))'
+
atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \
'echo $(( , 2 ))'
atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \
diff --git a/bin/sh/t_builtins.sh b/bin/sh/t_builtins.sh
index 36dfd3875e77..bb48283d73b0 100644
--- a/bin/sh/t_builtins.sh
+++ b/bin/sh/t_builtins.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_builtins.sh,v 1.6 2021/05/18 21:37:56 kre Exp $
+# $NetBSD: t_builtins.sh,v 1.7 2025/12/17 19:10:27 andvar Exp $
#
# Copyright (c) 2018 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -538,7 +538,7 @@ getopts_body() {
atf_test_case jobs
jobs_head() {
- atf_set "descr" "Tests the shell builting 'jobs' command"
+ atf_set "descr" "Tests the shell builtin 'jobs' command"
}
jobs_body() {
have_builtin jobs || return 0
diff --git a/bin/sh/t_fsplit.sh b/bin/sh/t_fsplit.sh
index cf732be8d6d3..d26ee8097e6d 100644
--- a/bin/sh/t_fsplit.sh
+++ b/bin/sh/t_fsplit.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_fsplit.sh,v 1.7 2017/06/24 11:06:17 kre Exp $
+# $NetBSD: t_fsplit.sh,v 1.10 2024/10/19 11:59:51 kre Exp $
#
# Copyright (c) 2007-2016 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -44,14 +44,19 @@ nl='
check()
{
+ if [ "${TEST}" -eq 0 ]
+ then
+ FAILURES=
+ fi
+
TEST=$((${TEST} + 1))
case "$#" in
(2) ;;
- (*) atf_fail "Internal test error, $# args to check test ${TEST}";;
+ (*) atf_fail "Internal test error, $# args to check, test ${TEST}";;
esac
- result=$( ${TEST_SH} -c "unset x; $1" )
+ result=$( ${TEST_SH} -c "unset x a b d c e f g h; $1" )
STATUS="$?"
# Remove newlines
@@ -60,46 +65,78 @@ check()
result="$(echo $result)"
IFS="$oifs"
- # trim the test text in case we use it in a message below
- case "$1" in
- ????????????????*)
- set -- "$(expr "$1" : '\(............\).*')..." "$2" ;;
- esac
+ # # trim the test text in case we use it in a message below
+ # case "$1" in
+ # ????????????????*)
+ # set -- "$(expr "$1" : '\(............\).*')..." "$2" ;;
+ # esac
- if [ "$2" != "$result" ]
+ if [ "$2" != "${result}" ]
then
- if [ "${STATUS}" = "0" ]
+ FAILURES="${FAILURES}${FAILURES:+ }${TEST}"
+ printf >&2 'Sub-test %d failed:\n %s\n' \
+ "${TEST}" "$1"
+ printf >&2 ' Expected: [%s]\n' "$2"
+ printf >&2 ' Received: [%s]\n' "${result}"
+
+ if [ "${STATUS}" != 0 ]
then
- atf_fail "Test ${TEST} '$1': expected [$2], found [$result]"
- else
- atf_fail \
- "TEST ${TEST} '$1' failed ($STATUS): expected [$2], found [$result]"
+ printf >&2 ' Sub-test exit status: %d\n' "${STATUS}"
fi
elif [ "${STATUS}" != 0 ]
then
- atf_fail "TEST ${TEST} '$1' failed ($STATUS)"
+ FAILURES="${FAILURES}${FAILURES:+ }${TEST}"
+ printf >&2 'Sub-test %d failed:\n\t%s\n' \
+ "${TEST}" "$1"
+ printf >&2 ' Sub-test exit status: %d (with correct output)\n' \
+ "${STATUS}"
fi
return 0
}
+check_results()
+{
+ NAME=$1
+
+ set -- ${FAILURES}
+
+ if [ $# -eq 0 ]
+ then
+ return 0
+ fi
+
+ unset IFS
+ printf >&2 'Subtest %s: %d sub-tests (of %d) [%s] failed.\n' \
+ "${NAME}" "$#" "${TEST}" "$*"
+
+ atf_fail "$# of ${TEST} sub-tests (${FAILURES}), see stderr"
+ return 0
+}
+
atf_test_case for
-for_head() {
+for_head()
+{
atf_set "descr" "Checks field splitting in for loops"
}
-for_body() {
+for_body()
+{
unset x
TEST=0
# Since I managed to break this, leave the test in
check 'for f in $x; do echo x${f}y; done' ''
+
+ check_results for
}
atf_test_case default_val
-default_val_head() {
+default_val_head()
+{
atf_set "descr" "Checks field splitting in variable default values"
}
-default_val_body() {
+default_val_body()
+{
TEST=0
# Check that IFS is applied to text from ${x-...} unless it is inside
# any set of "..."
@@ -157,13 +194,17 @@ default_val_body() {
'za b cz zdz'
check 'for i in ${x-a ${x-"b c"} d}; do echo "z${i}z"; done' \
'zaz zb cz zdz'
+
+ check_results default_val
}
atf_test_case replacement_val
-replacement_val_head() {
+replacement_val_head()
+{
atf_set "descr" "Checks field splitting in variable replacement values"
}
-replacement_val_body() {
+replacement_val_body()
+{
TEST=0
# Check that IFS is applied to text from ${x+...} unless it is inside
@@ -229,14 +270,18 @@ replacement_val_body() {
'zaz zb cz zdz'
check 'x=BOGUS; for i in ${x+a ${x+b c} d}; do echo "z${i}z"; done'\
'zaz zbz zcz zdz'
+
+ check_results replacement_val
}
atf_test_case ifs_alpha
-ifs_alpha_head() {
+ifs_alpha_head()
+{
atf_set "descr" "Checks that field splitting works with alphabetic" \
"characters"
}
-ifs_alpha_body() {
+ifs_alpha_body()
+{
unset x
TEST=0
@@ -257,14 +302,18 @@ ifs_alpha_body() {
check 'IFS=q; for i in ${x-aq${x-"bqc"}qd}; do echo "z${i}z"; done' \
'zaz zbqcz zdz'
+
+ check_results ifs_alpha
}
atf_test_case quote
-quote_head() {
+quote_head()
+{
atf_set "descr" "Checks that field splitting works with multi-word" \
"fields"
}
-quote_body() {
+quote_body()
+{
unset x
TEST=0
@@ -277,14 +326,18 @@ quote_body() {
check 'set "${x-"a b" c}"; echo $1' 'a b c'
check 'for i in "${x-a b c}"; do echo "z${i}z"; done' 'za b cz'
+
+ check_results quote
}
atf_test_case dollar_at
-dollar_at_head() {
+dollar_at_head()
+{
atf_set "descr" "Checks that field splitting works when expanding" \
"\$@"
}
-dollar_at_body() {
+dollar_at_body()
+{
unset x
TEST=0
@@ -292,7 +345,8 @@ dollar_at_body() {
check 'set --; for i in x"$@"x; do echo "z${i}z"; done' 'zxxz'
check 'set a; for i in x"$@"x; do echo "z${i}z"; done' 'zxaxz'
- check 'set a b; for i in x"$@"x; do echo "z${i}z"; done' 'zxaz zbxz'
+ check 'set a b; for i in x"$@"x; do echo "z${i}z"; done' \
+ 'zxaz zbxz'
check 'set --; for i; do echo "z${i}z"; done' ''
check 'set --; for i in $@; do echo "z${i}z"; done' ''
@@ -325,39 +379,58 @@ dollar_at_body() {
'zaz zbz zcaz zbz zcz'
check 'set a b c; for i in "$@""$@";do echo "z${i}z"; done' \
'zaz zbz zcaz zbz zcz'
+
+ check_results dollar_at
}
atf_test_case ifs
-ifs_head() {
+ifs_head()
+{
atf_set "descr" "Checks that IFS correctly configures field" \
"splitting behavior"
}
-ifs_body() {
+ifs_body()
+{
unset x
TEST=0
# Some IFS tests
- check 't="-- "; IFS=" "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '0'
- check 't=" x"; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
- check 't=" x "; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
- check 't=axb; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a:b'
- check 't="a x b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 a : b'
- check 't="a xx b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a :: b'
- check 't="a xx b"; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '3 a::b'
- # A recent 'clarification' means that a single trailing IFS non-whitespace
- # doesn't generate an empty parameter
- check 't="xax"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a'
- check 't="xax "; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '2 :a'
+ check 't="-- "; IFS=" "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '0'
+ check 't=" x"; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
+ check 't=" x "; IFS=" x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' '1'
+ check 't=axb; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' \
+ '2 a:b'
+ check 't="a x b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' \
+ '2 a : b'
+ check 't="a xx b"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' \
+ '3 a :: b'
+ check 't="a xx b"; IFS="x ";set $t; IFS=":"; r="$*"; IFS=; echo $# $r' \
+ '3 a::b'
+ # A recent 'clarification' means that a single trailing IFS
+ # non-whitespace doesn't generate an empty parameter
+ check 't="xax"; IFS="x"; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' \
+ '2 :a'
+ check 't="xax "; IFS="x "; set $t; IFS=":"; r="$*"; IFS=; echo $# $r' \
+ '2 :a'
# Verify that IFS isn't being applied where it shouldn't be.
- check 'IFS="x"; set axb; IFS=":"; r="$*"; IFS=; echo $# $r' '1 axb'
+ check 'IFS="x"; set axb; IFS=":"; r="$*"; IFS=; echo $# $r' '1 axb'
+ check 'IFS=x; set axb; IFS=:; r=$*; IFS=; echo $# $r' '1 axb'
+ check 'IFS=x; set axb; set -- "$*"; IFS=:; r=$*; IFS=; echo $# $r' \
+ '1 axb'
+ check 'IFS=x; set axb; set -- $* ; IFS=:; r=$*; IFS=; echo $# $r' \
+ '2 a:b'
+
+ check_results ifs
}
atf_test_case var_length
-var_length_head() {
+var_length_head()
+{
atf_set "descr" "Checks that field splitting works when expanding" \
"a variable's length"
}
-var_length_body() {
+var_length_body()
+{
TEST=0
long=12345678123456781234567812345678
@@ -378,14 +451,18 @@ var_length_body() {
check 'IFS=2; set ${x-${#long}}; : ; echo $* "$#"' '1 8 2'
check 'IFS=2; set ${x-${#long}}; : ; echo "$*" "$#"' '128 2'
check 'IFS=2; set ${x-${#long}}; : ; echo "$@" "$#"' '1 8 2'
+
+ check_results var_length
}
atf_test_case split_arith
-split_arith_head() {
+split_arith_head()
+{
atf_set "descr" "Checks that field splitting works when expanding" \
"the results from arithmetic"
}
-split_arith_body() {
+split_arith_body()
+{
TEST=0
# Check that we apply IFS to $(( expr ))
@@ -437,9 +514,108 @@ split_arith_body() {
check 'IFS=159; echo 11$(( 123456789 ))95' '11 234 678 95'
check 'IFS="159 "; echo 11$(( 123456789 ))95' '11 234 678 95'
check 'IFS="159 "; echo 11$(( 11234567899 ))95' '11 234 678 95'
+
+ check_results split_arith
}
-atf_init_test_cases() {
+atf_test_case read_split
+read_split_head()
+{
+ atf_set "descr" "Checks that field splitting works for the read" \
+ "built-in utility"
+}
+#
+# CAUTION: There are literal <tab> chars in the following test.
+# It is important that they be retained as is (the ones in the data
+# and results - those used for test formatting are immaterial).
+#
+read_split_body()
+{
+ DATA=" aaa bbb:ccc ddd+eee fff:ggg+hhh " # CAUTION: tabs!
+
+ TEST=0
+
+ check "unset IFS; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb:ccc><ddd+eee><fff:ggg+hhh><><><><>'
+
+ check "unset IFS; printf '%s\n' '${DATA}' | {
+ read x || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$x"; }' \
+ '<aaa bbb:ccc ddd+eee fff:ggg+hhh>'
+
+ check "IFS=; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ "<${DATA}><><><><><><><>"
+
+ check "IFS=' '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb:ccc><ddd+eee><fff:ggg+hhh><><><><>'
+
+ check "IFS=':'; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb><ccc ddd+eee fff><ggg+hhh ><><><><><>'
+
+ check "IFS=': '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb><ccc><ddd+eee fff><ggg+hhh ><><><>'
+
+ check "IFS=': '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb><ccc ddd+eee><fff><ggg+hhh>< ><><><>'
+
+ check "IFS='+'; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb:ccc ddd><eee fff:ggg><hhh ><><><><><>'
+
+ check "IFS=' +'; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb:ccc><ddd><eee fff:ggg><hhh ><><><>'
+
+ check "IFS='+ '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb:ccc ddd><eee><fff:ggg><hhh>< ><><><>'
+
+ # This tests the bug from PR bin/57849 (which existed about 2 days)
+ # It also tests that a var-assign before read does not corrupt the
+ # value of the var in the executing shell environment
+ check "IFS='+'; printf '%s\n' '${DATA}' | {
+ IFS=: read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$IFS" "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<+>< aaa bbb><ccc ddd+eee fff><ggg+hhh ><><><><><>'
+
+ check "IFS='+'; printf '%s\n' '${DATA}' | {
+ IFS= read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$IFS" "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ "<+><${DATA}><><><><><><><>"
+
+ # This doesn't really belong here, just tests that EOF works...
+ # (and that read sets unused vars to '', doesn't leave them unset)
+ check "unset IFS; set -u;
+ read a b c d e f g h </dev/null || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"' \
+ "FAIL:1<><><><><><><><>"
+
+ # And a similar one where EOF follows some data (which is read)
+ check "unset IFS; set -u; printf 'a b c' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ "FAIL:1<a><b><c><><><><><>"
+
+ check_results read_split
+}
+
+atf_init_test_cases()
+{
atf_add_test_case for
atf_add_test_case default_val
atf_add_test_case replacement_val
@@ -449,4 +625,5 @@ atf_init_test_cases() {
atf_add_test_case ifs
atf_add_test_case var_length
atf_add_test_case split_arith
+ atf_add_test_case read_split
}
diff --git a/bin/sh/t_input.sh b/bin/sh/t_input.sh
index 76f9224f9630..3e9b8ae13e72 100644
--- a/bin/sh/t_input.sh
+++ b/bin/sh/t_input.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_input.sh,v 1.1 2021/02/16 09:46:24 kre Exp $
+# $NetBSD: t_input.sh,v 1.2 2024/10/14 12:26:28 kre Exp $
#
# Copyright (c) 2021 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -48,6 +48,8 @@ nul_elimination_body() {
atf_require_prog cat
atf_require_prog rm
+ atf_expect_fail "nuls are now errors, not ignored, revisit later"
+
# please do not make even trivial changes (like correcting spelling)
# to the following script without taking care to fix the following
# tests, even minor changes can defeat the purpose of the test
diff --git a/bin/sh/t_shift.sh b/bin/sh/t_shift.sh
index f65c6c22dd24..0fe688c23898 100644
--- a/bin/sh/t_shift.sh
+++ b/bin/sh/t_shift.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_shift.sh,v 1.2 2016/05/17 09:05:14 kre Exp $
+# $NetBSD: t_shift.sh,v 1.3 2024/09/21 20:48:50 kre Exp $
#
# Copyright (c) 2016 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,8 +35,10 @@ basic_shift_test_body() {
for a in \
"one-arg::0:one-arg" \
+ "one-arg:--:0:one-arg" \
"one-arg:1:0:one-arg" \
- "one-arg:0:1 one-arg" \
+ "one-arg:-- 1:0:one-arg" \
+ "one-arg:-- 0:1 one-arg" \
"a b c::2 b c:a" \
"a b c:1:2 b c:a" \
"a b c:2:1 c:a:b" \
@@ -68,6 +70,39 @@ basic_shift_test_body() {
'set -- a b c d e;while [ $# -gt 0 ];do shift||echo ERR;done;echo complete'
}
+atf_test_case basic_rotate
+basic_rotate_head() {
+ atf_set "descr" "Test correct operation of valid rotates"
+}
+basic_rotate_body() {
+
+ for a in \
+ "one-arg:-0:1 one-arg" \
+ "one-arg:-1:1 one-arg" \
+ "one-arg:-- -1:1 one-arg" \
+ "a b c:-1:3 c a b" \
+ "a b c:-2:3 b c a" \
+ "a b c:-3:3 a b c" \
+ "a b c:-- -3:3 a b c" \
+ "a b c:-0:3 a b c" \
+ "a b c d e f g h i j k l m n o:-1:15 o a b c d e f g h i j k l m n" \
+ "a b c d e f g h i j k l m n o:-2:15 n o a b c d e f g h i j k l m" \
+ "a b c d e f g h i j k l m n o:-9:15 g h i j k l m n o a b c d e f" \
+ "a b c d e f g h i j k l m n o:-13:15 c d e f g h i j k l m n o a b" \
+ "a b c d e f g h i j k l m n o:-14:15 b c d e f g h i j k l m n o a" \
+ "a b c d e f g h i j k l m n o:-15:15 a b c d e f g h i j k l m n o"
+ do
+ oIFS="${IFS}"
+ IFS=:; set -- $a
+ IFS="${oIFS}"
+
+ init="$1"; n="$2"; res="$3"; shift 3
+
+ atf_check -s exit:0 -o "match:${res}" -e empty \
+ ${TEST_SH} -c "set -- ${init}; shift $n;"' echo "$# $*"'
+ done
+}
+
atf_test_case excessive_shift
excessive_shift_head() {
atf_set "descr" "Test acceptable operation of shift too many"
@@ -115,6 +150,34 @@ excessive_shift_body() {
done
}
+atf_test_case excessive_rotate
+excessive_rotate_head() {
+ atf_set "descr" "Test acceptable operation of rotate too many"
+}
+
+excessive_rotate_body() {
+ for a in \
+ "one-arg:2" \
+ "one-arg:4" \
+ "one-arg:13" \
+ "one two:3" \
+ "one two:7" \
+ "one two three four five:6" \
+ "I II III IV V VI VII VIII IX X XI XII XIII XIV XV:16" \
+ "I II III IV V VI VII VIII IX X XI XII XIII XIV XV:17" \
+ "I II III IV V VI VII VIII IX X XI XII XIII XIV XV:30" \
+ "I II III IV V VI VII VIII IX X XI XII XIII XIV XV:9999"
+ do
+ oIFS="${IFS}"
+ IFS=:; set -- $a
+ IFS="${oIFS}"
+
+ atf_check -s not-exit:0 -o match:OK -o not-match:ERR \
+ -e ignore ${TEST_SH} -c \
+ "set -- $1 ;echo OK:$#:-$2; shift -$2 && echo ERR"
+ done
+}
+
atf_test_case function_shift
function_shift_head() {
atf_set "descr" "Test that shift in a function does not affect outside"
@@ -149,10 +212,12 @@ non_numeric_shift_head() {
non_numeric_shift_body() {
# there are 9 args set, 010 is 8 if parsed octal, 10 decimal
- for a in a I 0x12 010 5V -1 ' ' '' +1 ' 1'
+ for a in a I 0x12 010 5V ' ' '' +1 ' 1'
do
atf_check -s not-exit:0 -o empty -e ignore ${TEST_SH} -c \
"set -- a b c d e f g h i; shift '$a' && echo ERROR"
+ atf_check -s not-exit:0 -o empty -e ignore ${TEST_SH} -c \
+ "set -- a b c d e f g h i; shift -- '$a' && echo ERROR"
done
}
@@ -165,7 +230,7 @@ too_many_args_head() {
too_many_args_body() {
# This tests the bug in PR bin/50896 is fixed
- for a in "1 1" "1 0" "1 2 3" "1 foo" "1 --" "-- 1"
+ for a in "1 1" "1 0" "1 2 3" "1 foo" "1 --" "-- 1 2" "-1 2"
do
atf_check -s not-exit:0 -o empty -e not-empty ${TEST_SH} -c \
" set -- a b c d; shift ${a} ; echo FAILED "
@@ -178,4 +243,6 @@ atf_init_test_cases() {
atf_add_test_case function_shift
atf_add_test_case non_numeric_shift
atf_add_test_case too_many_args
+ atf_add_test_case basic_rotate
+ atf_add_test_case excessive_rotate
}
diff --git a/bin/sh/t_syntax.sh b/bin/sh/t_syntax.sh
index 4b6a8db6a8f3..1d21d1318732 100644
--- a/bin/sh/t_syntax.sh
+++ b/bin/sh/t_syntax.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_syntax.sh,v 1.12 2021/11/22 05:07:15 kre Exp $
+# $NetBSD: t_syntax.sh,v 1.13 2023/12/28 20:04:10 andvar Exp $
#
# Copyright (c) 2017 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -114,7 +114,7 @@ b_comments_body() {
'echo \## #\#'
cat <<-'DONE' |
- # test comments do not provoke synax errors !\
+ # test comments do not provoke syntax errors !\
echo foo # ( { " hello
while : # that's forever
do # the following command list
diff --git a/bin/sh/t_ulimit.sh b/bin/sh/t_ulimit.sh
index 094a2eedc7e4..0bff3732feda 100644
--- a/bin/sh/t_ulimit.sh
+++ b/bin/sh/t_ulimit.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ulimit.sh,v 1.3 2016/03/27 14:50:01 christos Exp $
+# $NetBSD: t_ulimit.sh,v 1.4 2024/04/28 07:27:40 rillig Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -45,10 +45,10 @@ get_ulimits() {
}
limits_body() {
- atf_check -s eq:0 -o ignore -e empty ${TEST_SH} -c "ulimit -a"
+ atf_check -s exit:0 -o ignore -e empty ${TEST_SH} -c "ulimit -a"
for l in $(get_ulimits)
do
- atf_check -s eq:0 -o ignore -e empty ${TEST_SH} -c "ulimit $l"
+ atf_check -s exit:0 -o ignore -e empty ${TEST_SH} -c "ulimit $l"
done
}
diff --git a/bin/sh/t_varquote.sh b/bin/sh/t_varquote.sh
index 3811d85b29de..1e24e3c6ae3e 100644
--- a/bin/sh/t_varquote.sh
+++ b/bin/sh/t_varquote.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_varquote.sh,v 1.5 2016/03/27 14:50:01 christos Exp $
+# $NetBSD: t_varquote.sh,v 1.6 2024/04/28 07:27:40 rillig Exp $
#
# Copyright (c) 2007 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -113,7 +113,7 @@ nested_quotes_multiword_head() {
"string works (PR bin/43597)"
}
nested_quotes_multiword_body() {
- atf_check -s eq:0 -o match:"first-word second-word" -e empty \
+ atf_check -s exit:0 -o match:"first-word second-word" -e empty \
${TEST_SH} -c 'echo "${foo:="first-word"} second-word"'
}
@@ -123,8 +123,8 @@ default_assignment_with_arith_head() {
"string works (PR bin/50827)"
}
default_assignment_with_arith_body() {
- atf_check -s eq:0 -o empty -e empty ${TEST_SH} -c ': "${x=$((1))}"'
- atf_check -s eq:0 -o match:1 -e empty ${TEST_SH} -c 'echo "${x=$((1))}"'
+ atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c ': "${x=$((1))}"'
+ atf_check -s exit:0 -o match:1 -e empty ${TEST_SH} -c 'echo "${x=$((1))}"'
}
atf_init_test_cases() {
diff --git a/bin/tar/t_tar.sh b/bin/tar/t_tar.sh
index 13321d62fb84..a32f6c3ddb8c 100644
--- a/bin/tar/t_tar.sh
+++ b/bin/tar/t_tar.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_tar.sh,v 1.2 2018/11/30 00:53:41 christos Exp $
+# $NetBSD: t_tar.sh,v 1.3 2024/04/28 07:27:40 rillig Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,14 +35,14 @@ append_body() {
touch foo bar
# store both foo and bar into file1.tar
- atf_check -s eq:0 -o empty -e empty tar -cf file1.tar foo bar
+ atf_check -s exit:0 -o empty -e empty tar -cf file1.tar foo bar
# store foo into file2.tar, then append bar to file2.tar
- atf_check -s eq:0 -o empty -e empty tar -cf file2.tar foo
- atf_check -s eq:0 -o empty -e empty tar -rf file2.tar bar
+ atf_check -s exit:0 -o empty -e empty tar -cf file2.tar foo
+ atf_check -s exit:0 -o empty -e empty tar -rf file2.tar bar
# ensure that file1.tar and file2.tar are equal
- atf_check -s eq:0 -o empty -e empty cmp file1.tar file2.tar
+ atf_check -s exit:0 -o empty -e empty cmp file1.tar file2.tar
}
atf_test_case rd_base256_size
@@ -84,10 +84,10 @@ rd_base256_size_body() {
head -c 1450 /dev/zero >> test.tar
# test extracting the test archive
- atf_check -s eq:0 -o empty -e empty tar -xf test.tar
+ atf_check -s exit:0 -o empty -e empty tar -xf test.tar
# ensure that output.bin is equal to reference.bin
- atf_check -s eq:0 -o empty -e empty cmp output.bin reference.bin
+ atf_check -s exit:0 -o empty -e empty cmp output.bin reference.bin
}
atf_init_test_cases()
diff --git a/crypto/libcrypto/Makefile b/crypto/libcrypto/Makefile
index 4866893d73bc..0cfe2037718b 100644
--- a/crypto/libcrypto/Makefile
+++ b/crypto/libcrypto/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.15 2023/05/08 17:46:06 christos Exp $
+# $NetBSD: Makefile,v 1.18 2025/10/19 00:59:59 riastradh Exp $
.include <bsd.own.mk>
@@ -18,6 +18,10 @@ SUBDIR += lhash sha x509v3
TESTSDIR= ${TESTSBASE}/crypto/libcrypto
+TESTS_C+= t_sha512trunc
+DPADD.t_sha512trunc+= ${LIBCRYPTO}
+LDADD.t_sha512trunc+= -lcrypto
+
.if ${HAVE_OPENSSL} == 10
TESTS_SH= t_certs
.endif
diff --git a/crypto/libcrypto/Makefile.inc b/crypto/libcrypto/Makefile.inc
index b849db20e91a..d4a6be2830da 100644
--- a/crypto/libcrypto/Makefile.inc
+++ b/crypto/libcrypto/Makefile.inc
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.11 2023/05/08 17:46:06 christos Exp $
+# $NetBSD: Makefile.inc,v 1.14 2025/10/19 00:59:59 riastradh Exp $
.include <bsd.own.mk>
.include "../Makefile.inc"
@@ -29,7 +29,9 @@ CRYPTODIST= ${NETBSDSRCDIR}/crypto
.PATH: ${OPENSSLSRC}/crypto/${HELPER_DIR}
.endif
PROGDPLIBS+= cryptotest ${OPENSSLSRC}/../lib/libcryptotest
+.if ${HELPER_NAME} != "threadstest"
PROGDPLIBS+= crypto ${OPENSSLSRC}/../lib/libcrypto
+.endif
DPADD+= ${LIBCRYPT}
LDADD+= -lcrypt
diff --git a/crypto/libcrypto/bn/div/divtest.c b/crypto/libcrypto/bn/div/divtest.c
index 79dd8bd6fbcb..35b303a755dd 100644
--- a/crypto/libcrypto/bn/div/divtest.c
+++ b/crypto/libcrypto/bn/div/divtest.c
@@ -29,8 +29,8 @@ main(int argc, char *argv[])
int i = 0;
for (i = 0; i < 10000; i++) {
- BN_pseudo_rand(a, Rand(), 0, 0);
- BN_pseudo_rand(b, Rand(), 0, 0);
+ BN_rand(a, Rand(), 0, 0);
+ BN_rand(b, Rand(), 0, 0);
if (BN_is_zero(b))
continue;
diff --git a/crypto/libcrypto/dh/Makefile b/crypto/libcrypto/dh/Makefile
index 367b7e12f61f..a4ec06e069af 100644
--- a/crypto/libcrypto/dh/Makefile
+++ b/crypto/libcrypto/dh/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2023/05/08 17:46:06 christos Exp $
+# $NetBSD: Makefile,v 1.4 2025/10/19 00:59:59 riastradh Exp $
PROGDPLIBSSTATIC=yes
HELPER_NAME= dhtest
diff --git a/crypto/libcrypto/ec/Makefile b/crypto/libcrypto/ec/Makefile
index a32d7648bf8a..b21de5c394c3 100644
--- a/crypto/libcrypto/ec/Makefile
+++ b/crypto/libcrypto/ec/Makefile
@@ -1,6 +1,5 @@
-# $NetBSD: Makefile,v 1.2 2023/05/11 14:34:30 christos Exp $
+# $NetBSD: Makefile,v 1.3 2023/08/22 17:27:48 christos Exp $
-PROGDPLIBSSTATIC=yes
HELPER_NAME= ectest
HELPER_DIR= ec
diff --git a/crypto/libcrypto/t_libcrypto.sh b/crypto/libcrypto/t_libcrypto.sh
index 364329de30de..bf3ce38b0a4c 100644
--- a/crypto/libcrypto/t_libcrypto.sh
+++ b/crypto/libcrypto/t_libcrypto.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_libcrypto.sh,v 1.9 2023/05/08 17:46:06 christos Exp $
+# $NetBSD: t_libcrypto.sh,v 1.10 2024/04/28 07:27:40 rillig Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -78,7 +78,7 @@ threads_body()
-cert "$s/d_server.pem" \
-ccert "$s/d_client.pem" \
2>&1 | tee out
- atf_check -s eq:1 -o empty -e empty grep :error: out
+ atf_check -s exit:1 -o empty -e empty grep :error: out
fi
}
diff --git a/crypto/libcrypto/t_pubkey.sh b/crypto/libcrypto/t_pubkey.sh
index f3d429af2786..304a946f57df 100644
--- a/crypto/libcrypto/t_pubkey.sh
+++ b/crypto/libcrypto/t_pubkey.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_pubkey.sh,v 1.7 2023/05/08 17:46:06 christos Exp $
+# $NetBSD: t_pubkey.sh,v 1.9 2025/08/27 10:38:21 martin Exp $
#
# Copyright (c) 2008, 2009, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -29,6 +29,7 @@ atf_test_case dsa
dsa_head()
{
atf_set "descr" "Checks DSA cipher"
+ atf_set "timeout" "1800"
}
dsa_body()
{
diff --git a/crypto/libcrypto/threads/Makefile b/crypto/libcrypto/threads/Makefile
index 42eac7f368d7..acd20dbf8c28 100644
--- a/crypto/libcrypto/threads/Makefile
+++ b/crypto/libcrypto/threads/Makefile
@@ -1,7 +1,6 @@
-# $NetBSD: Makefile,v 1.7 2023/05/13 17:46:10 riastradh Exp $
+# $NetBSD: Makefile,v 1.10 2026/01/28 16:10:26 christos Exp $
.include <bsd.own.mk>
-PROGDPLIBSSTATIC=yes
HELPER_NAME= threadstest
HELPER_DIR= threads
@@ -13,6 +12,7 @@ COPTS.threadstest.c+= -Wno-missing-field-initializers
DPADD+= ${LIBPTHREAD} ${LIBSSL}
LDADD+= -lpthread -lssl
+
FILESDIR= ${TESTSDIR}
FILES= server.pem
FILESNAME_server.pem= d_server.pem
@@ -23,9 +23,16 @@ FILES+=rsakey.pem
FILES+=default.cnf
.endif
+FILES+=8489a545.0
+FILESDIR_8489a545.0= ${TESTSDIR}/store
+
HELPER_SRCS= ${${HAVE_OPENSSL} == 10 :? mttest.c : threadstest.c}
.include <bsd.init.mk>
.PATH: ${OPENSSLSRC}/apps
.PATH: ${OPENSSLSRC}/test/recipes/90-test_threads_data
+.PATH: ${OPENSSLSRC}/test/recipes/90-test_threads_data/store
+LIBCRYPTO!= cd ${OPENSSLSRC}/../lib/libcrypto && ${PRINTOBJDIR}
+LDADD_AFTER+= ${LIBCRYPTO}/libcrypto.a
+DPADD_AFTER+= ${LIBCRYPT}
diff --git a/crypto/opencrypto/t_opencrypto.sh b/crypto/opencrypto/t_opencrypto.sh
index 7270ecf15e57..8de095c6e1ac 100644
--- a/crypto/opencrypto/t_opencrypto.sh
+++ b/crypto/opencrypto/t_opencrypto.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_opencrypto.sh,v 1.9 2019/12/03 04:20:45 hikaru Exp $
+# $NetBSD: t_opencrypto.sh,v 1.11 2025/04/18 23:35:31 riastradh Exp $
#
# Copyright (c) 2014 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -301,6 +301,11 @@ ioctl_head() {
}
ioctl_body() {
+ case `uname -p` in
+ sparc) atf_expect_fail "PR port-sparc/59311:" \
+ " t_opencrypto:ioctl test is failing"
+ ;;
+ esac
common_body h_ioctl
}
diff --git a/dev/audio/audiotest.c b/dev/audio/audiotest.c
index 96622cf6c85d..046072ab83cd 100644
--- a/dev/audio/audiotest.c
+++ b/dev/audio/audiotest.c
@@ -1,4 +1,4 @@
-/* $NetBSD: audiotest.c,v 1.31 2023/08/03 08:36:38 rin Exp $ */
+/* $NetBSD: audiotest.c,v 1.33 2025/06/27 19:52:03 andvar Exp $ */
/*
* Copyright (C) 2019 Tetsuya Isaki. All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: audiotest.c,v 1.31 2023/08/03 08:36:38 rin Exp $");
+__RCSID("$NetBSD: audiotest.c,v 1.33 2025/06/27 19:52:03 andvar Exp $");
#include <errno.h>
#include <fcntl.h>
@@ -2773,13 +2773,13 @@ test_mmap_len(size_t len, off_t offset, int exp)
reset_after_mmap();
}
#define f(l, o, e) test_mmap_len(l, o, e)
-DEF(mmap_len_0) { f(0, 0, 0); } /* len is 0 */
+DEF(mmap_len_0) { f(0, 0, EINVAL); } /* len is 0 */
DEF(mmap_len_1) { f(1, 0, 0); } /* len is smaller than lsize */
DEF(mmap_len_2) { f(LS, 0, 0); } /* len is the same as lsize */
DEF(mmap_len_3) { f(LS1, 0, EOVERFLOW); } /* len is larger */
DEF(mmap_len_4) { f(0, -1, EINVAL); } /* offset is negative */
-DEF(mmap_len_5) { f(0, LS, 0); } /* pointless param but ok */
-DEF(mmap_len_6) { f(0, LS1, EOVERFLOW); } /* exceed */
+DEF(mmap_len_5) { f(0, LS, EINVAL); } /* len is 0 */
+DEF(mmap_len_6) { f(0, LS1, EINVAL); } /* len is 0 */
DEF(mmap_len_7) { f(1, LS, EOVERFLOW); } /* exceed */
/*
* When you treat the offset as 32bit, offset will be 0 and thus it
@@ -7001,7 +7001,7 @@ test_audioctl_open_multiuser(bool multiuser,
return;
}
if (geteuid() != 0) {
- XP_SKIP("This test must be priviledged user");
+ XP_SKIP("This test must be privileged user");
return;
}
diff --git a/dev/audio/h_pad.c b/dev/audio/h_pad.c
index a4a96c3f87e5..c29de1513af9 100644
--- a/dev/audio/h_pad.c
+++ b/dev/audio/h_pad.c
@@ -1,4 +1,4 @@
-/* $NetBSD: h_pad.c,v 1.3 2019/06/20 12:14:46 isaki Exp $ */
+/* $NetBSD: h_pad.c,v 1.4 2025/12/23 16:38:07 nia Exp $ */
/*
* Copyright (c) 2010 Antti Kantee. All Rights Reserved.
@@ -31,6 +31,7 @@
#include <rump/rump_syscalls.h>
#include <err.h>
+#include <endian.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
diff --git a/dev/fss/t_fss.sh b/dev/fss/t_fss.sh
index fa98c3d75fe0..5bc84c6278c6 100755
--- a/dev/fss/t_fss.sh
+++ b/dev/fss/t_fss.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_fss.sh,v 1.6 2023/05/11 01:56:31 gutteridge Exp $
+# $NetBSD: t_fss.sh,v 1.7 2025/04/19 02:07:43 rin Exp $
#
# Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -41,6 +41,9 @@ basic_head() {
}
basic_body() {
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
# verify fss is available (or loadable as a module)
diff --git a/fs/Makefile b/fs/Makefile
index 18a5efba7499..bb13b3496fc2 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.25 2022/06/06 10:56:29 nia Exp $
+# $NetBSD: Makefile,v 1.26 2025/12/24 15:37:30 thorpej Exp $
.include <bsd.own.mk>
@@ -6,9 +6,52 @@ TESTSDIR= ${TESTSBASE}/fs
SUBDIR+= common .WAIT
-TESTS_SUBDIRS+= ffs fifofs hfs kernfs lfs msdosfs nfs nullfs psshfs ptyfs puffs
-TESTS_SUBDIRS+= tmpfs umapfs union
-TESTS_SUBDIRS+= vfs cd9660
+TESTS_SUBDIRS+= ffs fifofs psshfs puffs
+TESTS_SUBDIRS+= vfs
+
+.if ${MKCD9660FS} != "no"
+TESTS_SUBDIRS+= cd9660
+.endif
+
+.if ${MKHFS} != "no"
+TESTS_SUBDIRS+= hfs
+.endif
+
+.if ${MKKERNFS} != "no"
+TESTS_SUBDIRS+= kernfs
+.endif
+
+.if ${MKLFS} != "no"
+TESTS_SUBDIRS+= lfs
+.endif
+
+.if ${MKMSDOSFS} != "no"
+TESTS_SUBDIRS+= msdosfs
+.endif
+
+.if ${MKNFS} != "no"
+TESTS_SUBDIRS+= nfs
+.endif
+
+.if ${MKNULLFS} != "no"
+TESTS_SUBDIRS+= nullfs
+.endif
+
+.if ${MKPTYFS} != "no"
+TESTS_SUBDIRS+= ptyfs
+.endif
+
+.if ${MKTMPFS} != "no"
+TESTS_SUBDIRS+= tmpfs
+.endif
+
+.if ${MKUMAPFS} != "no"
+TESTS_SUBDIRS+= umapfs
+.endif
+
+.if ${MKUNIONFS} != "no"
+TESTS_SUBDIRS+= union
+.endif
.if ${MKZFS} != "no"
TESTS_SUBDIRS+= zfs
diff --git a/fs/cd9660/Makefile b/fs/cd9660/Makefile
index 3d5e9db72599..ffb76ccf81f3 100644
--- a/fs/cd9660/Makefile
+++ b/fs/cd9660/Makefile
@@ -1,11 +1,12 @@
-# $NetBSD: Makefile,v 1.1 2014/05/10 14:15:25 martin Exp $
+# $NetBSD: Makefile,v 1.2 2024/04/28 14:39:22 rillig Exp $
-TESTSDIR= ${TESTSBASE}/fs/cd9660
-WARNS= 4
-FILESDIR= ${TESTSDIR}
+TESTSDIR= ${TESTSBASE}/fs/cd9660
+FILESDIR= ${TESTSDIR}
-TESTS_SH= t_high_ino_big_file
-FILES= pr_48787.image.bz2
-UUDECODE_FILES= pr_48787.image.bz2
+TESTS_SH= t_high_ino_big_file
+PROGS= h_hexdump_r
+MAN.h_hexdump_r= # none
+BINDIR.h_hexdump_r= ${TESTSDIR}
+FILES= pr_48787.image.hex
.include <bsd.test.mk>
diff --git a/fs/cd9660/pr_48787.image.bz2.uue b/fs/cd9660/pr_48787.image.bz2.uue
deleted file mode 100644
index d8f7488f36d2..000000000000
--- a/fs/cd9660/pr_48787.image.bz2.uue
+++ /dev/null
@@ -1,103 +0,0 @@
-begin 644 pr_48787.image.bz2
-M0EIH.3%!62936>D^3`0``+M_V?_7U17T!W_H/^_?8..V$"1DB`0``B$`0I-H
-MP`+N-!HLI8)131H4](]3TC(VH`S4;4````T&@R&C0R:!*$1D(8B:C!,(Q-&3
-M-`!,``"&:`FC'&AH&C3(TT:9`8F"``&@-`:9`8$R`J1(A&A$R&391FA#TC0V
-MHQ'J8@&T@VHT`QII&Z!"B5;S7YT+1"ZB8Y+5"M,5_J`!]Y:[$2%,%W`ZAA2@
-MVE)'DK^*?'3QU`DFQ4@22)(B[N3GZN?E<)`DDB.C)7\X71*B1K*2))(DD1HI
-MU5$TUVF[4JP89^FHY$B*FEBC(RN$5"8O'XO]1++(._=;ZKXR%:QK3^W7/>RT
-M8EODZ#MX53U8C0F]6O.G4J/9YNQA$B2))$<[<CT.C.)G[#NK)A3#\KM]#AP,
-M*V*=Z35CIY9O/Q-6T7&8=_%R-%>H5(]"2=])+_3RW)O*AI[)<ZVSDZ"I-3B2
-M3;T^%)3LM2^.3I+<>9@D^JV5RK3?43-;"G;69#AH8,(5;:7UN,<5%98$9;9;
-M\G*RT*37_9[;D'P/`1(R-$D.!36\S6N:_M>!][4*&3?'S858VCD+-3PINFR8
-M,C9?J+9ME:9.,_OR\C;3K'27W:K<<&>MMC;<YN*;!H83)Y-+"BCM6:&H"OT2
-M-]XWT/ZSW69R8]UG%S8IV5)$%2X)\%PF)G>HS".>68$Y&.B608>JM?)+3$:Z
-MY539A<7-E*'_YY..1'ECZBIG5%1%U93-9*1-5T_C!\)&2@?*CQB>(Q\0G(J<
-M6%PDB4L,2$>Q4IM%6A+%4K/0-!7*348,9!&#<9@JNP&+LBI>+9&*JC6ZE293
-MY%-8H^HI12#5$9J;"0@$DA.](1+1.SH#B10&H6C48:PMPI7=#M2A@I%'\J2P
-M.Y(+0C:B.&>F(^[(>)1+M\+QH%@O#4OE(\RE*14IZ7+9R*G8IYV^O=Y<=4HY
-M1C@SCIZ=$<UY5X+M6FT2)(DD1O#AYE/_]9B@K),IK(<$\6^`K\<@`&````00
-M`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8
-MH*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@
-M`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0
-M$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$
-M\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``
-M&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@
-MK),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``
-M8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2
-MU(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q
-M;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``8
-M0":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"L
-MDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@
-M```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4
-MA4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O
-M@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`
-M)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3
-M*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&``
-M``00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%
-M0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`
-MK\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`F
-MHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),I
-MK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```
-M!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`
-M2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"O
-MQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C
-M(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFL
-MAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$
-M$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+
-MF*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'
-M(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A
-M4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'
-M!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00
-M`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8
-MH*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@
-M`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0
-M$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$
-M\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``
-M&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@
-MK),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``
-M8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2
-MU(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q
-M;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``8
-M0":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"L
-MDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@
-M```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4
-MA4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O
-M@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`
-M)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3
-M*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&``
-M``00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%
-M0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`
-MK\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`F
-MHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),I
-MK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```
-M!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`
-M2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"O
-MQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$$``80":C
-M(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+F*"LDRFL
-MAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'(`!@```$
-M$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A4!+4A4!+
-MF*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'!/%O@*_'
-M(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00`!A`)J,A
-M4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8H*R3*:R'
-M!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(<$\6^`K\<@`&````00
-M`!A`)J,A4!+4A4!+F*"LDRFLAP3Q;X"OQR``8```!!``&$`FHR%0$M2%0$N8
-MH*R3*:R'!/%O@*_'(`!@```$$``80":C(5`2U(5`2YB@K),IK(KI-J(`.S;_
-M[O_KZIKZ`[_T'_?OL''[3!(R1`(```"`(``A3^1@`6=-9:!3`DD(:)ZC%)Z9
-M33:@>DT]"`>IH&@`#1Z)M3"-#(T#$4:I[4U`/4T-````````````!PT-&31H
-MT::&1D,(`R`&0::``!D#(`D4IZIZ0-`T````````````]&II7`12+EV$9U/B
-MB!*_@T]?CB(F_;A17-%[AD,R8`JV@70VUC,Y6`FQ"$@1<L2$)(`2[M+DHCF`
-M0)`D)8!-P/',(82"IS(@R>@M3"$@0)"3F`Y&Q/<D<N339,\$GB`#`Q1SK=@R
-M<HD1R!2\A(3.H3EOJB05)8.6&%6&J\9CF>$XJBC2?^*)EA9:/'NE+<&E/_K^
-M-Z0($"0E11*I%KQK=*`$'<N+G-F@9[YHI1'6M:8%.$2785901!%"0`U7%A/<
-MPA@I4`8&N@"3L[Y!8V2Y*M8>NO&"YPP%*V4`5T>42;8B[:=M@:9#;@')!UFD
-M8$)CB(&5G68PD`TD`[D"*AV+N\79)G^Q/SOS[CLC2P3T;\WCMH#X(5\++`-#
-ML-+?DXEFS9H@P06,,HP2-X<1W%B*AY`JW`=,R?NG%O?)8;N6134$BXK2#F&&
-M*"8&QUDIX$R\2.;XAFVSP/=K'6.!M8;%=UGWD84CA7$<.IJ0]NS'LEV@J(Q[
-MA='$&9W%-><1MMG8-JCG-DG+D,4"H>!`EJIEKV61?:5TW2M97U?>B%$S@N0G
-M4!Q5$=A,ES!<J\):&C=5);/*T,$9.=>Z%;4P):4`FG@`X=YHB%#"PIU084Y4
-M<J@33)%J*]&*'15=HQ"PK3%#K"--<BB@FF*H%$2]4Y]`\FT7`^32RN'76OEC
-M>@/JFD\8E9G8Y\8:0TJYP'=17J(:!3R>)1/FE%'Z2XBYRI259/935.OC-50:
-M#[&,:!IG0R$A"P8>:89+I+'"&$B")A'5G8B+ZJ14JXH:'.:@IH0&T(0($A+"
-/#6J,VO\7<D4X4)!E$I5"
-`
-end
diff --git a/fs/cd9660/t_high_ino_big_file.sh b/fs/cd9660/t_high_ino_big_file.sh
index c38f10300bb9..009fdf0d5af0 100644
--- a/fs/cd9660/t_high_ino_big_file.sh
+++ b/fs/cd9660/t_high_ino_big_file.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_high_ino_big_file.sh,v 1.4 2014/07/07 22:06:02 pgoyette Exp $
+# $NetBSD: t_high_ino_big_file.sh,v 1.7 2024/06/11 17:12:36 rillig Exp $
#
# Copyright (c) 2014 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -69,21 +69,22 @@ mntpnt=""
atf_test_case pr_kern_48787 cleanup
pr_kern_48787_head() {
- atf_set "descr" "Verifies 32bit overflow isssues from PR kern/48787 are fixed"
+ atf_set "descr" "Verifies 32bit overflow issues from PR kern/48787 are fixed"
atf_set "require.user" "root"
- atf_set "require.progs" "rump_cd9660 bunzip2 stat"
+ atf_set "require.progs" "rump_cd9660 stat"
atf_set "timeout" 6000
}
pr_kern_48787_body() {
- avail=$( df -Pk . | awk '{if (NR==2) print $4}' )
+ avail=$(df -Pk . | awk 'NR == 2 { print $4 }')
if [ $avail -lt 4500000 ]; then
atf_skip "not enough free disk space, have ${avail} Kbytes, need ~ 4500000 Kbytes"
fi
- bunzip2 < $(atf_get_srcdir)/pr_48787.image.bz2 > pr_48787.image
- mntpnt=$(pwd)/mnt
+ $(atf_get_srcdir)/h_hexdump_r < $(atf_get_srcdir)/pr_48787.image.hex > pr_48787.image || atf_fail "h_hexdump_r failed"
+ mntpnt=$PWD/mnt
mkdir ${mntpnt}
- rump_cd9660 -o norrip ./pr_48787.image ${mntpnt}
+
+ rump_cd9660 -o norrip "$PWD"/pr_48787.image ${mntpnt}
if [ ! -r ${mntpnt}/small_file ]; then
atf_fail "${mntpnt}/small_file does not exist"
fi
@@ -91,7 +92,8 @@ pr_kern_48787_body() {
atf_fail "${mntpnt}/my/large_file does not exist"
fi
umount ${mntpnt}
- rump_cd9660 ./pr_48787.image ${mntpnt}
+
+ rump_cd9660 "$PWD/pr_48787.image" ${mntpnt}
if [ ! -r ${mntpnt}/small_file ]; then
atf_fail "${mntpnt}/small_file does not exist"
fi
@@ -102,6 +104,7 @@ pr_kern_48787_body() {
atf_check -o match:"^4329541966$" stat -f "%i" ${mntpnt}/small_file
atf_check -o match:"^4329545920$" stat -f "%i" ${mntpnt}/my/large_file
umount ${mntpnt}
+
touch "done"
}
diff --git a/fs/common/fstest_lfs.c b/fs/common/fstest_lfs.c
index db1e43dbd803..fed14129e927 100644
--- a/fs/common/fstest_lfs.c
+++ b/fs/common/fstest_lfs.c
@@ -1,4 +1,4 @@
-/* $NetBSD: fstest_lfs.c,v 1.8 2020/06/17 00:16:21 kamil Exp $ */
+/* $NetBSD: fstest_lfs.c,v 1.11 2025/12/19 20:58:08 perseant Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -33,6 +33,7 @@
#include <sys/stat.h>
#include <atf-c.h>
+#include <ctype.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
@@ -49,6 +50,9 @@
#include "h_fsmacros.h"
#include "mount_lfs.h"
+/* Use the in-kernel cleaner rather than a separate lfs_cleanerd process */
+#define USE_KERNEL_CLEANER
+
struct lfstestargs {
struct ufs_args ta_uargs;
pthread_t ta_cleanerthread;
@@ -59,6 +63,8 @@ struct lfstestargs {
char ta_hostpath[MAXPATHLEN];
};
+static const char *image_filename;
+
int
lfs_fstest_newfs(const atf_tc_t *tc, void **buf, const char *image, off_t size,
void *fspriv)
@@ -68,6 +74,8 @@ lfs_fstest_newfs(const atf_tc_t *tc, void **buf, const char *image, off_t size,
static unsigned int num = 0;
struct lfstestargs *args;
+ image_filename = image;
+
size /= 512;
snprintf(cmd, 1024, "newfs_lfs -D -F -s %"PRId64" ./%s >/dev/null",
size, image);
@@ -121,6 +129,7 @@ lfs_fstest_delfs(const atf_tc_t *tc, void *buf)
return 0;
}
+#ifndef USE_KERNEL_CLEANER
static void *
cleaner(void *arg)
{
@@ -155,12 +164,17 @@ cleaner(void *arg)
return NULL;
}
+#endif /* 0 */
int
lfs_fstest_mount(const atf_tc_t *tc, void *buf, const char *path, int flags)
{
struct lfstestargs *args = buf;
int res;
+#ifdef USE_KERNEL_CLEANER
+ struct lfs_autoclean_params autoclean;
+ int fd;
+#endif /* USE_KERNEL_CLEANER */
res = rump_sys_mkdir(path, 0777);
if (res == -1)
@@ -168,16 +182,34 @@ lfs_fstest_mount(const atf_tc_t *tc, void *buf, const char *path, int flags)
res = rump_sys_mount(MOUNT_LFS, path, flags, &args->ta_uargs,
sizeof(args->ta_uargs));
- if (res == -1)
+ if (res == -1) {
+ fprintf(stderr, "sys_mount errno=%d\n", errno);
return res;
+ }
+#ifdef USE_KERNEL_CLEANER
+ fd = rump_sys_open(path, O_RDONLY);
+ autoclean.size = sizeof(autoclean);
+ autoclean.mode = LFS_CLEANMODE_GREEDY;
+ autoclean.thresh = -1;
+ autoclean.target = -1;
+ res = rump_sys_fcntl(fd, LFCNAUTOCLEAN, &autoclean);
+ if (res) {
+ fprintf(stderr, "LFCNAUTOCLEAN errno=%d\n", errno);
+ return res;
+ }
+ res = rump_sys_close(fd);
+ if (res)
+ return res;
+#else /* ! USE_KERNEL_CLEANER */
strcpy(args->ta_mntpath, path);
res = pthread_create(&args->ta_cleanerthread, NULL, cleaner, args);
if (res)
return res;
-
+
/* wait for cleaner to initialize */
sem_wait(&args->ta_cleanerloop);
+#endif /* ! USE_KERNEL_CLEANER */
return 0;
}
@@ -185,13 +217,42 @@ lfs_fstest_mount(const atf_tc_t *tc, void *buf, const char *path, int flags)
int
lfs_fstest_unmount(const atf_tc_t *tc, const char *path, int flags)
{
- int res;
+ int res, errors;
+ FILE *pipe, *err;
+ char s[MAXPATHLEN], cmd[1024];
res = rump_sys_unmount(path, flags);
if (res == -1) {
return res;
}
+ sprintf(cmd, "fsck_lfs -n -a -f %s", image_filename);
+ pipe = popen(cmd, "r");
+
+ errors = 0;
+ err = NULL;
+ while (fgets(s, MAXPATHLEN, pipe) != NULL) {
+ if (isdigit((int)s[0])) /* "5 files ... " */
+ continue;
+ if (isspace((int)s[0]) || s[0] == '*')
+ continue;
+ if (strncmp(s, "Alternate", 9) == 0)
+ continue;
+ if (strncmp(s, "ROLL ", 5) == 0)
+ continue;
+ fprintf(stderr, "FSCK: %s", s);
+ if (err == NULL)
+ err = fopen("/tmp/err.out", "w");
+ fprintf(err, "FSCK: %s", s);
+ ++errors;
+ }
+ pclose(pipe);
+ if (err)
+ fclose(err);
+ if (errors)
+ return -1;
+
res = rump_sys_rmdir(path);
return res;
}
+
diff --git a/fs/common/fstest_nfs.c b/fs/common/fstest_nfs.c
index c12b3b5da722..b74512a313c3 100644
--- a/fs/common/fstest_nfs.c
+++ b/fs/common/fstest_nfs.c
@@ -1,4 +1,4 @@
-/* $NetBSD: fstest_nfs.c,v 1.12 2020/06/17 00:16:21 kamil Exp $ */
+/* $NetBSD: fstest_nfs.c,v 1.13 2024/09/08 09:36:52 rillig Exp $ */
/*
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -290,7 +290,7 @@ dounmount(const atf_tc_t *tc, const char *path, int flags)
int status, i, sverrno;
/*
- * NFS handles sillyrenames in an workqueue. Some of them might
+ * NFS handles sillyrenames in a workqueue. Some of them might
* be still in the queue even if all user activity has ceased.
* We try to unmount for 2 seconds to give them a chance
* to flush out.
diff --git a/fs/common/fstest_v7fs.c b/fs/common/fstest_v7fs.c
index 6c3332365fbc..1ff3746fa602 100644
--- a/fs/common/fstest_v7fs.c
+++ b/fs/common/fstest_v7fs.c
@@ -1,4 +1,4 @@
-/* $NetBSD: fstest_v7fs.c,v 1.2 2020/06/17 00:16:21 kamil Exp $ */
+/* $NetBSD: fstest_v7fs.c,v 1.3 2025/12/23 16:38:07 nia Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <endian.h>
#include <fs/v7fs/v7fs_args.h>
@@ -79,7 +80,7 @@ v7fs_fstest_newfs(const atf_tc_t *tc, void **buf, const char *image,
snprintf(args->ta_devpath, MAXPATHLEN, "/dev/device%d.v7fs", num);
snprintf(args->ta_imgpath, MAXPATHLEN, "%s", image);
args->ta_uargs.fspec = args->ta_devpath;
- args->ta_uargs.endian = _BYTE_ORDER;
+ args->ta_uargs.endian = BYTE_ORDER;
res = rump_pub_etfs_register(args->ta_devpath, image, RUMP_ETFS_BLK);
if (res != 0) {
diff --git a/fs/common/h_fsmacros.h b/fs/common/h_fsmacros.h
index de33dcc27efc..d77d4b3001c3 100644
--- a/fs/common/h_fsmacros.h
+++ b/fs/common/h_fsmacros.h
@@ -1,4 +1,4 @@
-/* $NetBSD: h_fsmacros.h,v 1.44 2020/03/15 20:10:26 martin Exp $ */
+/* $NetBSD: h_fsmacros.h,v 1.45 2025/08/15 21:28:56 perseant Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -160,7 +160,15 @@ do { \
#define ATF_TP_FSADD(fs,func) \
ATF_TP_ADD_TC(tp,fs##_##func)
-#define ATF_TC_FSAPPLY_NOZFS(func,desc) \
+#ifdef WANT_ZFS_TESTS
+# define ATF_TC_FSADD_ZFS(func,desc) ATF_TC_FSADD(zfs,MOUNT_ZFS,func,desc)
+# define ATF_TP_FSADD_ZFS(func) ATF_TP_FSADD(zfs,func); /* semicolon sic */
+#else /* !WANT_ZFS_TESTS */
+# define ATF_TC_FSADD_ZFS(func,desc)
+# define ATF_TP_FSADD_ZFS(func)
+#endif /* WANT_ZFS_TESTS */
+
+#define ATF_TC_FSAPPLY(func,desc) \
ATF_TC_FSADD(ext2fs,MOUNT_EXT2FS,func,desc) \
ATF_TC_FSADD(ffs,MOUNT_FFS,func,desc) \
ATF_TC_FSADD(ffslog,MOUNT_FFS,func,desc) \
@@ -172,10 +180,10 @@ do { \
ATF_TC_FSADD(rumpfs,MOUNT_RUMPFS,func,desc) \
ATF_TC_FSADD(sysvbfs,MOUNT_SYSVBFS,func,desc) \
ATF_TC_FSADD(tmpfs,MOUNT_TMPFS,func,desc) \
- ATF_TC_FSADD(udf,MOUNT_UDF,func,desc) \
- ATF_TC_FSADD(v7fs,MOUNT_V7FS,func,desc)
-
-#define ATF_TP_FSAPPLY_NOZFS(func) \
+ ATF_TC_FSADD(udf,MOUNT_UDF,func,desc) \
+ ATF_TC_FSADD(v7fs,MOUNT_V7FS,func,desc) \
+ ATF_TC_FSADD_ZFS(func,desc)
+#define ATF_TP_FSAPPLY(func) \
ATF_TP_FSADD(ext2fs,func); \
ATF_TP_FSADD(ffs,func); \
ATF_TP_FSADD(ffslog,func); \
@@ -188,25 +196,8 @@ do { \
ATF_TP_FSADD(sysvbfs,func); \
ATF_TP_FSADD(tmpfs,func); \
ATF_TP_FSADD(udf,func); \
- ATF_TP_FSADD(v7fs,func);
-
-/* XXX: this will not scale */
-#ifdef WANT_ZFS_TESTS
-#define ATF_TC_FSAPPLY(func,desc) \
- ATF_TC_FSAPPLY_NOZFS(func,desc) \
- ATF_TC_FSADD(zfs,MOUNT_ZFS,func,desc)
-#define ATF_TP_FSAPPLY(func) \
- ATF_TP_FSAPPLY_NOZFS(func) \
- ATF_TP_FSADD(zfs,func);
-
-#else /* !WANT_ZFS_TESTS */
-
-#define ATF_TC_FSAPPLY(func,desc) \
- ATF_TC_FSAPPLY_NOZFS(func,desc)
-#define ATF_TP_FSAPPLY(func) \
- ATF_TP_FSAPPLY_NOZFS(func)
-
-#endif /* WANT_ZFS_TESTS */
+ ATF_TP_FSADD(v7fs,func); \
+ ATF_TP_FSADD_ZFS(func)
/*
* Same as above, but generate a file system image first and perform
@@ -227,7 +218,7 @@ do { \
ATF_TC_FSADD_RO(nfs,MOUNT_NFS,func,desc,gen) \
ATF_TC_FSADD_RO(nfsro,MOUNT_NFS,func,desc,gen) \
ATF_TC_FSADD_RO(sysvbfs,MOUNT_SYSVBFS,func,desc,gen) \
- ATF_TC_FSADD_RO(udf,MOUNT_UDF,func,desc,gen) \
+ ATF_TC_FSADD_RO(udf,MOUNT_UDF,func,desc,gen) \
ATF_TC_FSADD_RO(v7fs,MOUNT_V7FS,func,desc,gen)
#define ATF_TP_FSAPPLY_RO(func) \
diff --git a/fs/ffs/h_quota2_tests.c b/fs/ffs/h_quota2_tests.c
index 71cf3b4958f1..4d7abfc8e7fa 100644
--- a/fs/ffs/h_quota2_tests.c
+++ b/fs/ffs/h_quota2_tests.c
@@ -1,4 +1,4 @@
-/* $NetBSD: h_quota2_tests.c,v 1.5 2017/01/13 21:30:39 christos Exp $ */
+/* $NetBSD: h_quota2_tests.c,v 1.6 2024/09/08 09:36:52 rillig Exp $ */
/*
* rump server for advanced quota tests
@@ -97,7 +97,7 @@ quota_test1(const char *testopts)
warn("rump_sys_open");
} else {
/*
- * write up to the soft limit, wait a bit, an try to
+ * write up to the soft limit, wait a bit, and try to
* keep on writing
*/
int i;
diff --git a/fs/hfs/t_pathconvert.c b/fs/hfs/t_pathconvert.c
index 403cab082fcb..13ae153ca26d 100644
--- a/fs/hfs/t_pathconvert.c
+++ b/fs/hfs/t_pathconvert.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_pathconvert.c,v 1.7 2019/07/09 16:24:01 maya Exp $ */
+/* $NetBSD: t_pathconvert.c,v 1.8 2023/11/24 17:31:03 riastradh Exp $ */
#include <sys/types.h>
#include <sys/mount.h>
@@ -42,10 +42,10 @@ ATF_TC_BODY(colonslash, tc)
snprintf(thecmd, sizeof(thecmd), "uudecode %s/colon.hfs.bz2.uue",
atf_tc_get_config_var(tc, "srcdir"));
- RZ(system(thecmd));
+ RL(system(thecmd));
snprintf(thecmd, sizeof(thecmd), "bunzip2 " IMGNAME ".bz2");
- RZ(system(thecmd));
+ RL(system(thecmd));
memset(&args, 0, sizeof args);
args.fspec = __UNCONST(FAKEBLK);
diff --git a/fs/lfs/Makefile b/fs/lfs/Makefile
index 2c37fbbd6f1d..d494f2ab7ecb 100644
--- a/fs/lfs/Makefile
+++ b/fs/lfs/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.3 2020/08/18 03:02:50 perseant Exp $
+# $NetBSD: Makefile,v 1.5 2025/10/21 04:25:31 perseant Exp $
#
.include <bsd.own.mk>
@@ -6,7 +6,13 @@
TESTSDIR= ${TESTSBASE}/fs/lfs
WARNS= 4
-TESTS_C= t_pr t_rfw
+
+TESTS_C= t_basic t_fcntl t_orphan t_pr t_resize t_rfw
+SRCS.t_basic+= util.c t_basic.c
+SRCS.t_fcntl+= util.c t_fcntl.c
+SRCS.t_orphan+= util.c t_orphan.c
+SRCS.t_resize+= util.c t_resize.c
+SRCS.t_rfw+= util.c t_rfw.c
LDADD+=-lrumpfs_lfs -lrumpfs_ffs # fs drivers
LDADD+=-lrumpdev_disk -lrumpdev # disk device
diff --git a/fs/lfs/t_rfw.c b/fs/lfs/t_rfw.c
index 403eed991525..fca09bec0c52 100644
--- a/fs/lfs/t_rfw.c
+++ b/fs/lfs/t_rfw.c
@@ -1,13 +1,11 @@
-/* $NetBSD: t_rfw.c,v 1.3 2020/08/23 22:34:29 riastradh Exp $ */
+/* $NetBSD: t_rfw.c,v 1.8 2025/10/30 15:30:17 perseant Exp $ */
#include <sys/types.h>
-#include <sys/mount.h>
#include <sys/wait.h>
+#include <sys/sysctl.h>
#include <atf-c.h>
-#include <ctype.h>
#include <errno.h>
-#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -22,52 +20,58 @@
#include <ufs/lfs/lfs_extern.h>
#include "h_macros.h"
+#include "util.h"
/* Debugging conditions */
/* #define FORCE_SUCCESS */ /* Don't actually revert, everything worked */
+/* #define USE_DUMPLFS */ /* Dump the filesystem at certain steps */
-/* Write a well-known byte pattern into a file, appending if it exists */
-int write_file(const char *, int);
-
-/* Check the byte pattern and size of the file */
-int check_file(const char *, int);
+/* Temporary files to store superblocks */
+#define SBLOCK0_COPY "sb0.dd"
+#define SBLOCK1_COPY "sb1.dd"
-/* Check the file system for consistency */
-int fsck(void);
+/* Size of the image file, in 512-blocks */
+#define FSSIZE 10000
-/* Actually run the test, differentiating the orphaned delete problem */
+/* Actually run the test */
void test(int);
-ATF_TC(rfw);
-ATF_TC_HEAD(rfw, tc)
+ATF_TC(rfw32);
+ATF_TC_HEAD(rfw32, tc)
{
atf_tc_set_md_var(tc, "descr",
- "LFS roll-forward creates an inconsistent filesystem");
+ "LFS32 roll-forward creates an inconsistent filesystem");
atf_tc_set_md_var(tc, "timeout", "20");
}
-#define MAXLINE 132
-#define CHUNKSIZE 300
-
-#define IMGNAME "disk.img"
-#define FAKEBLK "/dev/blk"
-#define LOGFILE "newfs.log"
-#define SBLOCK0_COPY "sb0.dd"
-#define SBLOCK1_COPY "sb1.dd"
+ATF_TC(rfw64);
+ATF_TC_HEAD(rfw64, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "LFS64 roll-forward creates an inconsistent filesystem");
+ atf_tc_set_md_var(tc, "timeout", "20");
+}
-#define MP "/mp"
#define UNCHANGED_CONTROL MP "/3-unchanged-control"
#define TO_BE_DELETED MP "/4-to-be-deleted"
#define TO_BE_APPENDED MP "/5-to-be-appended"
#define NEWLY_CREATED MP "/6-newly-created"
-long long sbaddr[2] = { -1, -1 };
const char *sblock[2] = { SBLOCK0_COPY, SBLOCK1_COPY };
-ATF_TC_BODY(rfw, tc)
+ATF_TC_BODY(rfw32, tc)
+{
+ test(32);
+}
+
+ATF_TC_BODY(rfw64, tc)
+{
+ test(64);
+}
+
+void test(int width)
{
struct ufs_args args;
- FILE *pipe;
char buf[MAXLINE];
int i;
@@ -76,32 +80,10 @@ ATF_TC_BODY(rfw, tc)
/*
* Initialize.
*/
- atf_tc_expect_fail("roll-forward not yet implemented");
+ atf_tc_expect_pass();
/* Create filesystem, note superblock locations */
- fprintf(stderr, "* Create file system\n");
- if (system("newfs_lfs -D -F -s 10000 ./" IMGNAME " > " LOGFILE) == -1)
- atf_tc_fail_errno("newfs failed");
- pipe = fopen(LOGFILE, "r");
- if (pipe == NULL)
- atf_tc_fail_errno("newfs failed to execute");
- while (fgets(buf, MAXLINE, pipe) != NULL) {
- if (sscanf(buf, "%lld,%lld", sbaddr, sbaddr + 1) == 2)
- break;
- }
- while (fgets(buf, MAXLINE, pipe) != NULL)
- ;
- fclose(pipe);
- if (sbaddr[0] < 0 || sbaddr[1] < 0)
- atf_tc_fail("superblock not found");
- fprintf(stderr, "* Superblocks at %lld and %lld\n",
- sbaddr[0], sbaddr[1]);
-
- /* Set up rump */
- rump_init();
- if (rump_sys_mkdir(MP, 0777) == -1)
- atf_tc_fail_errno("cannot create mountpoint");
- rump_pub_etfs_register(FAKEBLK, IMGNAME, RUMP_ETFS_BLK);
+ create_lfs(FSSIZE, FSSIZE, width, 1);
/*
* Create initial filesystem state, from which
@@ -117,9 +99,9 @@ ATF_TC_BODY(rfw, tc)
/* Payload */
fprintf(stderr, "* Initial payload\n");
- write_file(UNCHANGED_CONTROL, CHUNKSIZE);
- write_file(TO_BE_DELETED, CHUNKSIZE);
- write_file(TO_BE_APPENDED, CHUNKSIZE);
+ write_file(UNCHANGED_CONTROL, CHUNKSIZE, 1, 3);
+ write_file(TO_BE_DELETED, CHUNKSIZE, 1, 4);
+ write_file(TO_BE_APPENDED, CHUNKSIZE, 1, 5);
rump_sys_sync();
rump_sys_sync();
sleep(1); /* XXX yuck - but we need the superblocks dirty */
@@ -133,6 +115,8 @@ ATF_TC_BODY(rfw, tc)
/* Unmount */
rump_sys_unmount(MP, 0);
+ if (fsck())
+ atf_tc_fail_errno("fsck found errors after first unmount");
/*
* Make changes which we will attempt to roll forward.
@@ -143,19 +127,24 @@ ATF_TC_BODY(rfw, tc)
if (rump_sys_mount(MOUNT_LFS, MP, 0, &args, sizeof(args)) == -1)
atf_tc_fail_errno("rump_sys_mount failed [2]");
+ fprintf(stderr, "* Update payload\n");
+
/* Add new file */
- write_file(NEWLY_CREATED, CHUNKSIZE);
+ write_file(NEWLY_CREATED, CHUNKSIZE, 1, 6);
/* Append to existing file */
- write_file(TO_BE_APPENDED, CHUNKSIZE);
+ write_file(TO_BE_APPENDED, CHUNKSIZE, 1, 5);
/* Delete file */
rump_sys_unlink(TO_BE_DELETED);
/* Done with payload, unmount fs */
rump_sys_unmount(MP, 0);
+ if (fsck())
+ atf_tc_fail_errno("fsck found errors after second unmount");
#ifndef FORCE_SUCCESS
+ fprintf(stderr, "* Revert superblocks\n");
/*
* Copy back old superblocks, reverting FS to old state
*/
@@ -167,7 +156,10 @@ ATF_TC_BODY(rfw, tc)
if (fsck())
atf_tc_fail_errno("fsck found errors with old superblocks");
-#endif
+#endif /* FORCE_SUCCESS */
+#ifdef USE_DUMPLFS
+ dumplfs();
+#endif /* USE_DUMPLFS */
/*
* Roll forward.
@@ -186,11 +178,15 @@ ATF_TC_BODY(rfw, tc)
* Use fsck_lfs to look for consistency errors.
*/
+ fprintf(stderr, "* Fsck after roll-forward\n");
if (fsck()) {
fprintf(stderr, "*** FAILED FSCK ***\n");
atf_tc_fail("fsck found errors after roll forward");
}
-
+#ifdef USE_DUMPLFS
+ dumplfs();
+#endif /* USE_DUMPLFS */
+
/*
* Check file system contents
*/
@@ -200,25 +196,28 @@ ATF_TC_BODY(rfw, tc)
if (rump_sys_mount(MOUNT_LFS, MP, 0, &args, sizeof(args)) == -1)
atf_tc_fail_errno("rump_sys_mount failed [4]");
- if (check_file(UNCHANGED_CONTROL, CHUNKSIZE) != 0)
+ if (check_file(UNCHANGED_CONTROL, CHUNKSIZE, 3) != 0)
atf_tc_fail("Unchanged control file differs(!)");
- if (check_file(TO_BE_APPENDED, 2 * CHUNKSIZE) != 0)
+ if (rump_sys_access(TO_BE_DELETED, F_OK) == 0)
+ atf_tc_fail("Removed file still present");
+ else
+ fprintf(stderr, "%s: no problem\n", TO_BE_DELETED);
+
+ if (check_file(TO_BE_APPENDED, 2 * CHUNKSIZE, 5) != 0)
atf_tc_fail("Appended file differs");
if (rump_sys_access(NEWLY_CREATED, F_OK) != 0)
atf_tc_fail("Newly added file missing");
- if (check_file(NEWLY_CREATED, CHUNKSIZE) != 0)
+ if (check_file(NEWLY_CREATED, CHUNKSIZE, 6) != 0)
atf_tc_fail("Newly added file differs");
- if (rump_sys_access(TO_BE_DELETED, F_OK) == 0)
- atf_tc_fail("Removed file still present");
-
/* Umount filesystem */
rump_sys_unmount(MP, 0);
/* Final fsck to double check */
+ fprintf(stderr, "* Fsck after final unmount\n");
if (fsck()) {
fprintf(stderr, "*** FAILED FSCK ***\n");
atf_tc_fail("fsck found errors after final unmount");
@@ -228,97 +227,7 @@ ATF_TC_BODY(rfw, tc)
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, rfw);
+ ATF_TP_ADD_TC(tp, rfw32);
+ ATF_TP_ADD_TC(tp, rfw64);
return atf_no_error();
}
-
-/* Write some data into a file */
-int write_file(const char *filename, int add)
-{
- int fd, size, i;
- struct stat statbuf;
- unsigned char b;
- int flags = O_CREAT|O_WRONLY;
-
- if (rump_sys_stat(filename, &statbuf) < 0)
- size = 0;
- else {
- size = statbuf.st_size;
- flags |= O_APPEND;
- }
-
- fd = rump_sys_open(filename, flags);
-
- for (i = 0; i < add; i++) {
- b = ((unsigned)(size + i)) & 0xff;
- rump_sys_write(fd, &b, 1);
- }
- rump_sys_close(fd);
-
- return 0;
-}
-
-/* Check file's existence, size and contents */
-int check_file(const char *filename, int size)
-{
- int fd, i;
- struct stat statbuf;
- unsigned char b;
-
- if (rump_sys_stat(filename, &statbuf) < 0) {
- fprintf(stderr, "%s: stat failed\n", filename);
- return 1;
- }
- if (size != statbuf.st_size) {
- fprintf(stderr, "%s: expected %d bytes, found %d\n",
- filename, size, (int)statbuf.st_size);
- return 2;
- }
-
- fd = rump_sys_open(filename, O_RDONLY);
- for (i = 0; i < size; i++) {
- rump_sys_read(fd, &b, 1);
- if (b != (((unsigned)i) & 0xff)) {
- fprintf(stderr, "%s: byte %d: expected %x found %x\n",
- filename, i, ((unsigned)(i)) & 0xff, b);
- rump_sys_close(fd);
- return 3;
- }
- }
- rump_sys_close(fd);
- fprintf(stderr, "%s: no problem\n", filename);
- return 0;
-}
-
-/* Run a file system consistency check */
-int fsck(void)
-{
- char s[MAXLINE];
- int i, errors = 0;
- FILE *pipe;
- char cmd[MAXLINE];
-
- for (i = 0; i < 2; i++) {
- sprintf(cmd, "fsck_lfs -n -b %jd -f " IMGNAME,
- (intmax_t)sbaddr[i]);
- pipe = popen(cmd, "r");
- while (fgets(s, MAXLINE, pipe) != NULL) {
- if (isdigit((int)s[0])) /* "5 files ... " */
- continue;
- if (isspace((int)s[0]) || s[0] == '*')
- continue;
- if (strncmp(s, "Alternate", 9) == 0)
- continue;
- if (strncmp(s, "ROLL ", 5) == 0)
- continue;
- fprintf(stderr, "FSCK[sb@%lld]: %s", sbaddr[i], s);
- ++errors;
- }
- pclose(pipe);
- if (errors) {
- break;
- }
- }
-
- return errors;
-}
diff --git a/fs/nullfs/t_basic.c b/fs/nullfs/t_basic.c
index bf905cd9b756..be5b244b0b5d 100644
--- a/fs/nullfs/t_basic.c
+++ b/fs/nullfs/t_basic.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_basic.c,v 1.5 2020/06/26 07:50:12 jruoho Exp $ */
+/* $NetBSD: t_basic.c,v 1.6 2024/07/28 12:55:59 bad Exp $ */
#include <sys/types.h>
#include <sys/mount.h>
@@ -78,9 +78,9 @@ ATF_TC_BODY(basic, tc)
rump_init();
if (rump_sys_mkdir("/td1", 0777) == -1)
- atf_tc_fail_errno("mp1");
+ atf_tc_fail_errno("mkdir /td1");
if (rump_sys_mkdir("/td2", 0777) == -1)
- atf_tc_fail_errno("mp1");
+ atf_tc_fail_errno("mkdir /td2");
/* use tmpfs because rumpfs doesn't support regular files */
memset(&targs, 0, sizeof(targs));
@@ -146,16 +146,14 @@ ATF_TC_HEAD(twistymount, tc)
ATF_TC_BODY(twistymount, tc)
{
- int mkd = 0;
-
rump_init();
if (rump_sys_mkdir("/td", 0777) == -1)
- atf_tc_fail_errno("mkdir %d", mkd++);
+ atf_tc_fail_errno("mkdir /td");
if (rump_sys_mkdir("/td/dist", 0777) == -1)
- atf_tc_fail_errno("mkdir %d", mkd++);
+ atf_tc_fail_errno("mkdir /td/dist");
if (rump_sys_mkdir("/mp", 0777) == -1)
- atf_tc_fail_errno("mkdir %d", mkd++);
+ atf_tc_fail_errno("mkdir /mp");
/* MNT_RDONLY doesn't matter, but just for compat with the PR */
mountnull("/td", "/mp", MNT_RDONLY);
diff --git a/fs/psshfs/t_psshfs.sh b/fs/psshfs/t_psshfs.sh
index 245b9939ac57..f247614ba17a 100644
--- a/fs/psshfs/t_psshfs.sh
+++ b/fs/psshfs/t_psshfs.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_psshfs.sh,v 1.9 2017/05/24 15:29:51 christos Exp $
+# $NetBSD: t_psshfs.sh,v 1.10 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -72,13 +72,13 @@ start_ssh() {
sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \
$(atf_get_srcdir)/sshd_config.in >sshd_config || \
atf_fail "Failed to create sshd_config"
- atf_check -s eq:0 -o empty -e empty cp /usr/libexec/sftp-server .
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty cp /usr/libexec/sftp-server .
+ atf_check -s exit:0 -o empty -e empty \
cp $(atf_get_srcdir)/ssh_host_key .
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
cp $(atf_get_srcdir)/ssh_host_key.pub .
- atf_check -s eq:0 -o empty -e empty chmod 400 ssh_host_key
- atf_check -s eq:0 -o empty -e empty chmod 444 ssh_host_key.pub
+ atf_check -s exit:0 -o empty -e empty chmod 400 ssh_host_key
+ atf_check -s exit:0 -o empty -e empty chmod 444 ssh_host_key.pub
/usr/sbin/sshd -e -f ./sshd_config >sshd.log 2>&1 &
while [ ! -f sshd.pid ]; do
@@ -87,14 +87,14 @@ start_ssh() {
echo "SSH server started (pid $(cat sshd.pid))"
echo "Setting up SSH client configuration"
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
ssh-keygen -f ssh_user_key -t rsa -b 1024 -N "" -q
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
cp ssh_user_key.pub authorized_keys
echo "[localhost]:10000,[127.0.0.1]:10000,[::1]:10000" \
"$(cat $(atf_get_srcdir)/ssh_host_key.pub)" >known_hosts || \
atf_fail "Failed to create known_hosts"
- atf_check -s eq:0 -o empty -e empty chmod 600 authorized_keys
+ atf_check -s exit:0 -o empty -e empty chmod 600 authorized_keys
sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \
$(atf_get_srcdir)/ssh_config.in >ssh_config || \
atf_fail "Failed to create ssh_config"
@@ -119,7 +119,7 @@ stop_ssh() {
# Both directories are supposed to live on the current directory.
#
mount_psshfs() {
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
mount -t psshfs -o -F=$(pwd)/ssh_config localhost:$(pwd)/${1} ${2}
}
@@ -159,13 +159,13 @@ EOF
mkdir mnt
mount_psshfs root mnt
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
./ne_inodes.sh root/dir root/dir/file1
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
./ne_inodes.sh root/dir root/dir/file2
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
./ne_inodes.sh root/dir/file1 root/dir/file2
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
./ne_inodes.sh root/file3 root/file4
}
inode_nos_cleanup() {
@@ -186,11 +186,11 @@ pwd_body() {
mkdir root/dir
mkdir mnt
- atf_check -s eq:0 -o save:stdout -e empty \
+ atf_check -s exit:0 -o save:stdout -e empty \
-x 'echo $(cd mnt && /bin/pwd)/dir'
mv stdout expout
mount_psshfs root mnt
- atf_check -s eq:0 -o file:expout -e empty \
+ atf_check -s exit:0 -o file:expout -e empty \
-x 'cd mnt/dir && ls .. >/dev/null && /bin/pwd'
}
pwd_cleanup() {
diff --git a/fs/tmpfs/h_funcs.subr b/fs/tmpfs/h_funcs.subr
index 07c1644da66f..feb25c4217ea 100644
--- a/fs/tmpfs/h_funcs.subr
+++ b/fs/tmpfs/h_funcs.subr
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# $NetBSD: h_funcs.subr,v 1.5 2013/03/17 01:16:45 jmmv Exp $
+# $NetBSD: h_funcs.subr,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -40,7 +40,7 @@ test_mount() {
require_fs tmpfs
Mount_Point=$(pwd)/mntpt
- atf_check -s eq:0 -o empty -e empty mkdir "${Mount_Point}"
+ atf_check -s exit:0 -o empty -e empty mkdir "${Mount_Point}"
echo "mount -t tmpfs ${*} tmpfs ${Mount_Point}"
mount -t tmpfs "${@}" tmpfs "${Mount_Point}" 2>mounterr
if [ "${?}" -ne 0 ]; then
@@ -60,8 +60,8 @@ test_mount() {
#
test_unmount() {
cd - >/dev/null
- atf_check -s eq:0 -o empty -e empty umount ${Mount_Point}
- atf_check -s eq:0 -o empty -e empty rmdir ${Mount_Point}
+ atf_check -s exit:0 -o empty -e empty umount ${Mount_Point}
+ atf_check -s exit:0 -o empty -e empty rmdir ${Mount_Point}
Mount_Point=
}
diff --git a/fs/tmpfs/t_create.sh b/fs/tmpfs/t_create.sh
index f1f894dfd65f..77d845d569c9 100644
--- a/fs/tmpfs/t_create.sh
+++ b/fs/tmpfs/t_create.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_create.sh,v 1.8 2011/03/05 07:41:11 pooka Exp $
+# $NetBSD: t_create.sh,v 1.9 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -37,9 +37,9 @@ create_head() {
create_body() {
test_mount
- atf_check -s eq:1 -o empty -e empty test -f a
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty test -f a
+ atf_check -s exit:1 -o empty -e empty test -f a
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty test -f a
test_unmount
}
@@ -59,9 +59,9 @@ attrs_body() {
test_mount
umask 022
- atf_check -s eq:1 -o empty -e empty test -f a
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty test -f a
+ atf_check -s exit:1 -o empty -e empty test -f a
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty test -f a
eval $(stat -s . | sed -e 's|st_|dst_|g')
eval $(stat -s a)
@@ -71,24 +71,24 @@ attrs_body() {
test ${st_gid} -eq ${dst_gid} || atf_fail "Incorrect gid"
test ${st_mode} = 0100644 || atf_fail "Incorrect mode"
- atf_check -s eq:0 -o empty -e empty mkdir b c
+ atf_check -s exit:0 -o empty -e empty mkdir b c
- atf_check -s eq:0 -o empty -e empty chown ${user}:0 b
+ atf_check -s exit:0 -o empty -e empty chown ${user}:0 b
eval $(stat -s b)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
- atf_check -s eq:0 -o empty -e empty chown ${user}:100 c
+ atf_check -s exit:0 -o empty -e empty chown ${user}:100 c
eval $(stat -s c)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
- atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'touch b/a'
+ atf_check -s exit:0 -o empty -e empty su -m ${user} -c 'touch b/a'
eval $(stat -s b/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
- atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'touch c/a'
+ atf_check -s exit:0 -o empty -e empty su -m ${user} -c 'touch c/a'
eval $(stat -s c/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
@@ -105,7 +105,7 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir
echo 'touch dir/a' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
diff --git a/fs/tmpfs/t_devices.sh b/fs/tmpfs/t_devices.sh
index 472d37860dd8..3b66b4788cb9 100644
--- a/fs/tmpfs/t_devices.sh
+++ b/fs/tmpfs/t_devices.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_devices.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_devices.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,12 +35,12 @@ basic_body() {
umask 022
- atf_check -s eq:0 -o ignore -e ignore /dev/MAKEDEV std
- atf_check -s eq:0 -o empty -e empty test -e zero
- atf_check -s eq:0 -o empty -e empty test -e null
+ atf_check -s exit:0 -o ignore -e ignore /dev/MAKEDEV std
+ atf_check -s exit:0 -o empty -e empty test -e zero
+ atf_check -s exit:0 -o empty -e empty test -e null
echo "Reading from the 'zero' character device"
- atf_check -s eq:0 -o ignore -e ignore dd if=zero of=a bs=10k count=1
+ atf_check -s exit:0 -o ignore -e ignore dd if=zero of=a bs=10k count=1
[ $(md5 a | cut -d ' ' -f 4) = 1276481102f218c981e0324180bafd9f ] || \
atf_fail "Data read is invalid"
diff --git a/fs/tmpfs/t_dots.sh b/fs/tmpfs/t_dots.sh
index e480de7658ac..dd37858a8fe8 100644
--- a/fs/tmpfs/t_dots.sh
+++ b/fs/tmpfs/t_dots.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_dots.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_dots.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -34,9 +34,9 @@ topdir_head() {
topdir_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty test -d ./a
- atf_check -s eq:0 -o empty -e empty test -d a/../a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty test -d ./a
+ atf_check -s exit:0 -o empty -e empty test -d a/../a
test_unmount
}
@@ -50,10 +50,10 @@ nesteddir_head() {
nesteddir_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty mkdir a/b
- atf_check -s eq:0 -o empty -e empty test -d a/b/../b
- atf_check -s eq:0 -o empty -e empty test -d a/b/../../a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a/b
+ atf_check -s exit:0 -o empty -e empty test -d a/b/../b
+ atf_check -s exit:0 -o empty -e empty test -d a/b/../../a
test_unmount
}
diff --git a/fs/tmpfs/t_exec.sh b/fs/tmpfs/t_exec.sh
index 9ffc6008a139..2f3706936964 100644
--- a/fs/tmpfs/t_exec.sh
+++ b/fs/tmpfs/t_exec.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_exec.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_exec.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,11 +35,11 @@ basic_head() {
basic_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty cp /bin/cp .
+ atf_check -s exit:0 -o empty -e empty cp /bin/cp .
echo "Verifying copied file"
[ $(md5 cp | cut -d ' ' -f 4) = $(md5 /bin/cp | cut -d ' ' -f 4) ] || \
atf_file "New binary file does not match original"
- atf_check -s eq:0 -o empty -e empty ./cp cp foo
+ atf_check -s exit:0 -o empty -e empty ./cp cp foo
test_unmount
}
diff --git a/fs/tmpfs/t_link.sh b/fs/tmpfs/t_link.sh
index b436104d9146..29d6064d35eb 100644
--- a/fs/tmpfs/t_link.sh
+++ b/fs/tmpfs/t_link.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_link.sh,v 1.6 2021/10/30 09:53:47 hannken Exp $
+# $NetBSD: t_link.sh,v 1.7 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,14 +38,14 @@ basic_head() {
basic_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty touch z
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty touch z
eval $(stat -s a | sed -e 's|st_|sta_|g')
eval $(stat -s z | sed -e 's|st_|stz_|g')
test ${sta_ino} != ${stz_ino} || \
atf_fail "Node numbers are not different"
test ${sta_nlink} -eq 1 || atf_fail "Number of links is incorrect"
- atf_check -s eq:0 -o empty -e empty ln a b
+ atf_check -s exit:0 -o empty -e empty ln a b
echo "Checking if link count is correct after links are created"
eval $(stat -s a | sed -e 's|st_|sta_|g')
@@ -55,10 +55,10 @@ basic_body() {
test ${stb_nlink} -eq 2 || atf_fail "Link count is incorrect"
echo "Checking if link count is correct after links are deleted"
- atf_check -s eq:0 -o empty -e empty rm a
+ atf_check -s exit:0 -o empty -e empty rm a
eval $(stat -s b | sed -e 's|st_|stb_|g')
test ${stb_nlink} -eq 1 || atf_fail "Link count is incorrect"
- atf_check -s eq:0 -o empty -e empty rm b
+ atf_check -s exit:0 -o empty -e empty rm b
test_unmount
}
@@ -72,9 +72,9 @@ subdirs_head() {
subdirs_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty mkdir c
- atf_check -s eq:0 -o empty -e empty ln a c/b
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty mkdir c
+ atf_check -s exit:0 -o empty -e empty ln a c/b
echo "Checking if link count is correct after links are created"
eval $(stat -s a | sed -e 's|st_|sta_|g')
@@ -84,11 +84,11 @@ subdirs_body() {
test ${stb_nlink} -eq 2 || atf_fail "Link count is incorrect"
echo "Checking if link count is correct after links are deleted"
- atf_check -s eq:0 -o empty -e empty rm a
+ atf_check -s exit:0 -o empty -e empty rm a
eval $(stat -s c/b | sed -e 's|st_|stb_|g')
test ${stb_nlink} -eq 1 || atf_fail "Link count is incorrect"
- atf_check -s eq:0 -o empty -e empty rm c/b
- atf_check -s eq:0 -o empty -e empty rmdir c
+ atf_check -s exit:0 -o empty -e empty rm c/b
+ atf_check -s exit:0 -o empty -e empty rmdir c
test_unmount
}
@@ -102,8 +102,8 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
- atf_check -s eq:0 -o empty -e empty touch dir/a
+ atf_check -s exit:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty touch dir/a
echo 'ln dir/a dir/b' | kqueue_monitor 2 dir dir/a
kqueue_check dir/a NOTE_LINK
kqueue_check dir NOTE_WRITE
@@ -111,8 +111,8 @@ kqueue_body() {
echo 'rm dir/a' | kqueue_monitor 2 dir dir/b
kqueue_check dir/b NOTE_DELETE
kqueue_check dir NOTE_WRITE
- atf_check -s eq:0 -o empty -e empty rm dir/b
- atf_check -s eq:0 -o empty -e empty rmdir dir
+ atf_check -s exit:0 -o empty -e empty rm dir/b
+ atf_check -s exit:0 -o empty -e empty rmdir dir
test_unmount
}
diff --git a/fs/tmpfs/t_mkdir.sh b/fs/tmpfs/t_mkdir.sh
index db0d1e3c5c8f..5358d55026c1 100644
--- a/fs/tmpfs/t_mkdir.sh
+++ b/fs/tmpfs/t_mkdir.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_mkdir.sh,v 1.8 2011/03/05 07:41:11 pooka Exp $
+# $NetBSD: t_mkdir.sh,v 1.9 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -39,9 +39,9 @@ single_head() {
single_body() {
test_mount
- atf_check -s eq:1 -o empty -e empty test -d a
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty test -d a
+ atf_check -s exit:1 -o empty -e empty test -d a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty test -d a
test -d a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 3 ] || atf_fail "Link count is not 3"
@@ -59,9 +59,9 @@ many_body() {
test_mount
for d in $(jot 100); do
- atf_check -s eq:1 -o empty -e empty test -d ${d}
- atf_check -s eq:0 -o empty -e empty mkdir ${d}
- atf_check -s eq:0 -o empty -e empty test -d ${d}
+ atf_check -s exit:1 -o empty -e empty test -d ${d}
+ atf_check -s exit:0 -o empty -e empty mkdir ${d}
+ atf_check -s exit:0 -o empty -e empty test -d ${d}
done
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 102 ] || atf_fail "Link count is not 102"
@@ -77,9 +77,9 @@ nested_head() {
nested_body() {
test_mount
- atf_check -s eq:1 -o empty -e empty test -d a/b/c/d/e
- atf_check -s eq:0 -o empty -e empty mkdir -p a/b/c/d/e
- atf_check -s eq:0 -o empty -e empty test -d a/b/c/d/e
+ atf_check -s exit:1 -o empty -e empty test -d a/b/c/d/e
+ atf_check -s exit:0 -o empty -e empty mkdir -p a/b/c/d/e
+ atf_check -s exit:0 -o empty -e empty test -d a/b/c/d/e
test_unmount
}
@@ -98,24 +98,24 @@ attrs_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir b c
+ atf_check -s exit:0 -o empty -e empty mkdir b c
- atf_check -s eq:0 -o empty -e empty chown ${user}:0 b
+ atf_check -s exit:0 -o empty -e empty chown ${user}:0 b
eval $(stat -s b)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
- atf_check -s eq:0 -o empty -e empty chown ${user}:100 c
+ atf_check -s exit:0 -o empty -e empty chown ${user}:100 c
eval $(stat -s c)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
- atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'mkdir b/a'
+ atf_check -s exit:0 -o empty -e empty su -m ${user} -c 'mkdir b/a'
eval $(stat -s b/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 0 ] || atf_fail "Incorrect group"
- atf_check -s eq:0 -o empty -e empty su -m ${user} -c 'mkdir c/a'
+ atf_check -s exit:0 -o empty -e empty su -m ${user} -c 'mkdir c/a'
eval $(stat -s c/a)
[ ${st_uid} -eq $(id -u ${user}) ] || atf_fail "Incorrect owner"
[ ${st_gid} -eq 100 ] || atf_fail "Incorrect group"
@@ -132,7 +132,7 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir
echo 'mkdir dir/a' | kqueue_monitor 2 dir
# Creating a directory raises NOTE_LINK on the parent directory
@@ -141,8 +141,8 @@ kqueue_body() {
# Creating a directory raises NOTE_WRITE on the parent directory
kqueue_check dir NOTE_WRITE
- atf_check -s eq:0 -o empty -e empty rmdir dir/a
- atf_check -s eq:0 -o empty -e empty rmdir dir
+ atf_check -s exit:0 -o empty -e empty rmdir dir/a
+ atf_check -s exit:0 -o empty -e empty rmdir dir
test_unmount
}
diff --git a/fs/tmpfs/t_mknod.sh b/fs/tmpfs/t_mknod.sh
index 62c7cce22834..76f4f5c7c2f6 100644
--- a/fs/tmpfs/t_mknod.sh
+++ b/fs/tmpfs/t_mknod.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_mknod.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_mknod.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,7 +38,7 @@ block_body() {
test_mount
umask 022
- atf_check -s eq:0 -o empty -e empty mknod fd0a b 2 0
+ atf_check -s exit:0 -o empty -e empty mknod fd0a b 2 0
eval $(stat -s fd0a)
[ ${st_mode} = 060644 ] || atf_fail "Invalid mode"
[ ${st_rdev} -eq 512 ] || atf_fail "Invalid device"
@@ -56,7 +56,7 @@ block_kqueue_body() {
test_mount
umask 022
- atf_check -s eq:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir
echo 'mknod dir/fd0a b 2 0' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
@@ -72,7 +72,7 @@ char_body() {
test_mount
umask 022
- atf_check -s eq:0 -o empty -e empty mknod null c 2 2
+ atf_check -s exit:0 -o empty -e empty mknod null c 2 2
eval $(stat -s null)
[ ${st_mode} = 020644 ] || atf_fail "Invalid mode"
[ ${st_rdev} -eq 514 ] || atf_fail "Invalid device"
@@ -90,7 +90,7 @@ char_kqueue_body() {
test_mount
umask 022
- atf_check -s eq:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir
echo 'mknod dir/null c 2 2' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
@@ -106,7 +106,7 @@ pipe_body() {
test_mount
umask 022
- atf_check -s eq:0 -o empty -e empty mknod pipe p
+ atf_check -s exit:0 -o empty -e empty mknod pipe p
eval $(stat -s pipe)
[ ${st_mode} = 010644 ] || atf_fail "Invalid mode"
@@ -123,7 +123,7 @@ pipe_kqueue_body() {
test_mount
umask 022
- atf_check -s eq:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir
echo 'mknod dir/pipe p' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
diff --git a/fs/tmpfs/t_mount.sh b/fs/tmpfs/t_mount.sh
index 11a77d49c24a..4663d1a6a75f 100644
--- a/fs/tmpfs/t_mount.sh
+++ b/fs/tmpfs/t_mount.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_mount.sh,v 1.6 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_mount.sh,v 1.7 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -104,9 +104,9 @@ large_body() {
test_unmount
mkdir tmp
- atf_check -s eq:1 -o empty -e ignore \
+ atf_check -s exit:1 -o empty -e ignore \
mount -t tmpfs -o -s9223372036854775808 tmpfs tmp
- atf_check -s eq:1 -o empty -e ignore \
+ atf_check -s exit:1 -o empty -e ignore \
mount -t tmpfs -o -s9223372036854775808g tmpfs tmp
rmdir tmp
}
@@ -119,12 +119,12 @@ mntpt_head() {
}
mntpt_body() {
mount_tmpfs unused $(pwd)/mnt >out 2>&1
- atf_check -s eq:1 -o empty -e empty grep unused out
- atf_check -s eq:0 -o ignore -e empty grep "$(pwd)/mnt" out
+ atf_check -s exit:1 -o empty -e empty grep unused out
+ atf_check -s exit:0 -o ignore -e empty grep "$(pwd)/mnt" out
mount_tmpfs unused mnt >out 2>&1
- atf_check -s eq:1 -o empty -e empty grep unused out
- atf_check -s eq:0 -o ignore -e empty grep mnt out
+ atf_check -s exit:1 -o empty -e empty grep unused out
+ atf_check -s exit:0 -o ignore -e empty grep mnt out
}
atf_init_test_cases() {
diff --git a/fs/tmpfs/t_pipes.sh b/fs/tmpfs/t_pipes.sh
index 7c0065a9cb1d..d77403083350 100644
--- a/fs/tmpfs/t_pipes.sh
+++ b/fs/tmpfs/t_pipes.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_pipes.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_pipes.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,7 +35,7 @@ basic_body() {
umask 022
- atf_check -s eq:0 -o empty -e empty mknod pipe p
+ atf_check -s exit:0 -o empty -e empty mknod pipe p
echo "Writing to pipe and waiting for response"
echo -n foo >pipe &
diff --git a/fs/tmpfs/t_read_write.sh b/fs/tmpfs/t_read_write.sh
index 13cc2560ad44..eb5704d0bdda 100644
--- a/fs/tmpfs/t_read_write.sh
+++ b/fs/tmpfs/t_read_write.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_read_write.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_read_write.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -64,7 +64,7 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o ignore -e ignore \
+ atf_check -s exit:0 -o ignore -e ignore \
dd if=/dev/zero of=c bs=1k count=10
echo 'dd if=/dev/zero of=c seek=2 bs=1k count=1 conv=notrunc' \
'>/dev/null 2>&1' | kqueue_monitor 1 c
diff --git a/fs/tmpfs/t_readdir.sh b/fs/tmpfs/t_readdir.sh
index 6f5dc3ef2bde..25c00a6a9dc2 100644
--- a/fs/tmpfs/t_readdir.sh
+++ b/fs/tmpfs/t_readdir.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_readdir.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_readdir.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,9 +38,9 @@ dots_head() {
dots_body() {
test_mount
- atf_check -s eq:0 -o save:stdout -e empty /bin/ls -a
- atf_check -s eq:0 -o ignore -e empty grep '^\.$' stdout
- atf_check -s eq:0 -o ignore -e empty grep '^\..$' stdout
+ atf_check -s exit:0 -o save:stdout -e empty /bin/ls -a
+ atf_check -s exit:0 -o ignore -e empty grep '^\.$' stdout
+ atf_check -s exit:0 -o ignore -e empty grep '^\..$' stdout
test_unmount
}
@@ -54,17 +54,17 @@ types_head() {
types_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
- atf_check -s eq:0 -o empty -e empty touch reg
- atf_check -s eq:0 -o empty -e empty ln -s reg lnk
- atf_check -s eq:0 -o empty -e empty mknod blk b 0 0
- atf_check -s eq:0 -o empty -e empty mknod chr c 0 0
- atf_check -s eq:0 -o empty -e empty mknod fifo p
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty touch reg
+ atf_check -s exit:0 -o empty -e empty ln -s reg lnk
+ atf_check -s exit:0 -o empty -e empty mknod blk b 0 0
+ atf_check -s exit:0 -o empty -e empty mknod chr c 0 0
+ atf_check -s exit:0 -o empty -e empty mknod fifo p
+ atf_check -s exit:0 -o empty -e empty \
$(atf_get_srcdir)/h_tools sockets sock
- atf_check -s eq:0 -o ignore -e empty ls
- atf_check -s eq:0 -o empty -e empty rm -rf *
+ atf_check -s exit:0 -o ignore -e empty ls
+ atf_check -s exit:0 -o empty -e empty rm -rf *
test_unmount
}
@@ -78,10 +78,10 @@ caching_head() {
caching_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch $(jot 10)
- atf_check -s eq:0 -o empty -e empty rm *
- atf_check -s eq:0 -o empty -e empty touch $(jot 20)
- atf_check -s eq:0 -o empty -e empty -x "ls >/dev/null"
+ atf_check -s exit:0 -o empty -e empty touch $(jot 10)
+ atf_check -s exit:0 -o empty -e empty rm *
+ atf_check -s exit:0 -o empty -e empty touch $(jot 20)
+ atf_check -s exit:0 -o empty -e empty -x "ls >/dev/null"
test_unmount
}
@@ -94,13 +94,13 @@ many_head() {
many_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a
echo "Creating 500 files"
for f in $(jot 500); do
touch a/$f
done
- atf_check -s eq:0 -o empty -e empty rm a/*
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty rm a/*
+ atf_check -s exit:0 -o empty -e empty rmdir a
test_unmount
}
diff --git a/fs/tmpfs/t_remove.sh b/fs/tmpfs/t_remove.sh
index df868f9ccf52..9ee9dd6c8e47 100644
--- a/fs/tmpfs/t_remove.sh
+++ b/fs/tmpfs/t_remove.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_remove.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_remove.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -37,11 +37,11 @@ single_head() {
single_body() {
test_mount
- atf_check -s eq:1 -o empty -e empty test -f a
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty test -f a
- atf_check -s eq:0 -o empty -e empty rm a
- atf_check -s eq:1 -o empty -e empty test -f a
+ atf_check -s exit:1 -o empty -e empty test -f a
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty test -f a
+ atf_check -s exit:0 -o empty -e empty rm a
+ atf_check -s exit:1 -o empty -e empty test -f a
test_unmount
}
@@ -55,12 +55,12 @@ uchg_head() {
uchg_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty chflags uchg a
- atf_check -s eq:1 -o empty -e ignore rm -f a
- atf_check -s eq:0 -o empty -e empty chflags nouchg a
- atf_check -s eq:0 -o empty -e empty rm a
- atf_check -s eq:1 -o empty -e empty test -f a
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty chflags uchg a
+ atf_check -s exit:1 -o empty -e ignore rm -f a
+ atf_check -s exit:0 -o empty -e empty chflags nouchg a
+ atf_check -s exit:0 -o empty -e empty rm a
+ atf_check -s exit:1 -o empty -e empty test -f a
test_unmount
}
@@ -73,9 +73,9 @@ dot_head() {
dot_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:1 -o empty -e ignore unlink a/.
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:1 -o empty -e ignore unlink a/.
+ atf_check -s exit:0 -o empty -e empty rmdir a
test_unmount
}
@@ -89,12 +89,12 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
- atf_check -s eq:0 -o empty -e empty touch dir/a
+ atf_check -s exit:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty touch dir/a
echo 'rm dir/a' | kqueue_monitor 2 dir dir/a
kqueue_check dir/a NOTE_DELETE
kqueue_check dir NOTE_WRITE
- atf_check -s eq:0 -o empty -e empty rmdir dir
+ atf_check -s exit:0 -o empty -e empty rmdir dir
test_unmount
}
diff --git a/fs/tmpfs/t_rename.sh b/fs/tmpfs/t_rename.sh
index 7613f1f493a8..c704efbceaca 100644
--- a/fs/tmpfs/t_rename.sh
+++ b/fs/tmpfs/t_rename.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_rename.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_rename.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,10 +38,10 @@ dots_head() {
dots_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:1 -o empty -e ignore mv a/. c
- atf_check -s eq:1 -o empty -e ignore mv a/.. c
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:1 -o empty -e ignore mv a/. c
+ atf_check -s exit:1 -o empty -e ignore mv a/.. c
+ atf_check -s exit:0 -o empty -e empty rmdir a
test_unmount
}
@@ -54,12 +54,12 @@ crossdev_head() {
crossdev_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a /var/tmp/a
- atf_check -s eq:0 -o ignore -e empty grep "Cross-device link" stderr
- atf_check -s eq:0 -o empty -e empty test -d a
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o ignore -e empty grep "Cross-device link" stderr
+ atf_check -s exit:0 -o empty -e empty test -d a
+ atf_check -s exit:0 -o empty -e empty rmdir a
test_unmount
}
@@ -72,11 +72,11 @@ basic_head() {
basic_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty mv a c
- atf_check -s eq:1 -o empty -e empty test -d a
- atf_check -s eq:0 -o empty -e empty test -d c
- atf_check -s eq:0 -o empty -e empty rmdir c
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mv a c
+ atf_check -s exit:1 -o empty -e empty test -d a
+ atf_check -s exit:0 -o empty -e empty test -d c
+ atf_check -s exit:0 -o empty -e empty rmdir c
test_unmount
}
@@ -91,37 +91,37 @@ dotdot_body() {
test_mount
echo "Checking if the '..' entry is updated after moves"
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty mkdir b
- atf_check -s eq:0 -o empty -e empty mv b a
- atf_check -s eq:0 -o empty -e empty test -d a/b/../b
- atf_check -s eq:0 -o empty -e empty test -d a/b/../../a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir b
+ atf_check -s exit:0 -o empty -e empty mv b a
+ atf_check -s exit:0 -o empty -e empty test -d a/b/../b
+ atf_check -s exit:0 -o empty -e empty test -d a/b/../../a
eval $(stat -s a/b)
[ ${st_nlink} = 2 ] || atf_fail "Incorrect number of links"
eval $(stat -s a)
[ ${st_nlink} = 3 ] || atf_fail "Incorrect number of links"
- atf_check -s eq:0 -o empty -e empty rmdir a/b
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty rmdir a/b
+ atf_check -s exit:0 -o empty -e empty rmdir a
echo "Checking if the '..' entry is correct after renames"
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty mkdir b
- atf_check -s eq:0 -o empty -e empty mv b a
- atf_check -s eq:0 -o empty -e empty mv a c
- atf_check -s eq:0 -o empty -e empty test -d c/b/../b
- atf_check -s eq:0 -o empty -e empty test -d c/b/../../c
- atf_check -s eq:0 -o empty -e empty rmdir c/b
- atf_check -s eq:0 -o empty -e empty rmdir c
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir b
+ atf_check -s exit:0 -o empty -e empty mv b a
+ atf_check -s exit:0 -o empty -e empty mv a c
+ atf_check -s exit:0 -o empty -e empty test -d c/b/../b
+ atf_check -s exit:0 -o empty -e empty test -d c/b/../../c
+ atf_check -s exit:0 -o empty -e empty rmdir c/b
+ atf_check -s exit:0 -o empty -e empty rmdir c
echo "Checking if the '..' entry is correct after multiple moves"
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty mkdir b
- atf_check -s eq:0 -o empty -e empty mv b a
- atf_check -s eq:0 -o empty -e empty mv a c
- atf_check -s eq:0 -o empty -e empty mv c/b d
- atf_check -s eq:0 -o empty -e empty test -d d/../c
- atf_check -s eq:0 -o empty -e empty rmdir d
- atf_check -s eq:0 -o empty -e empty rmdir c
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir b
+ atf_check -s exit:0 -o empty -e empty mv b a
+ atf_check -s exit:0 -o empty -e empty mv a c
+ atf_check -s exit:0 -o empty -e empty mv c/b d
+ atf_check -s exit:0 -o empty -e empty test -d d/../c
+ atf_check -s exit:0 -o empty -e empty rmdir d
+ atf_check -s exit:0 -o empty -e empty rmdir c
test_unmount
}
@@ -135,14 +135,14 @@ dir_to_emptydir_head() {
dir_to_emptydir_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty touch a/c
- atf_check -s eq:0 -o empty -e empty mkdir b
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty touch a/c
+ atf_check -s exit:0 -o empty -e empty mkdir b
+ atf_check -s exit:0 -o empty -e empty \
$(atf_get_srcdir)/h_tools rename a b
- atf_check -s eq:1 -o empty -e empty test -e a
- atf_check -s eq:0 -o empty -e empty test -d b
- atf_check -s eq:0 -o empty -e empty test -f b/c
+ atf_check -s exit:1 -o empty -e empty test -e a
+ atf_check -s exit:0 -o empty -e empty test -d b
+ atf_check -s exit:0 -o empty -e empty test -f b/c
rm b/c
rmdir b
@@ -158,17 +158,17 @@ dir_to_fulldir_head() {
dir_to_fulldir_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty touch a/c
- atf_check -s eq:0 -o empty -e empty mkdir b
- atf_check -s eq:0 -o empty -e empty touch b/d
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty touch a/c
+ atf_check -s exit:0 -o empty -e empty mkdir b
+ atf_check -s exit:0 -o empty -e empty touch b/d
+ atf_check -s exit:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a b
- atf_check -s eq:0 -o ignore -e empty grep "Directory not empty" stderr
- atf_check -s eq:0 -o empty -e empty test -d a
- atf_check -s eq:0 -o empty -e empty test -f a/c
- atf_check -s eq:0 -o empty -e empty test -d b
- atf_check -s eq:0 -o empty -e empty test -f b/d
+ atf_check -s exit:0 -o ignore -e empty grep "Directory not empty" stderr
+ atf_check -s exit:0 -o empty -e empty test -d a
+ atf_check -s exit:0 -o empty -e empty test -f a/c
+ atf_check -s exit:0 -o empty -e empty test -d b
+ atf_check -s exit:0 -o empty -e empty test -f b/d
rm a/c
rm b/d
rmdir a
@@ -186,13 +186,13 @@ dir_to_file_head() {
dir_to_file_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty touch b
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty touch b
+ atf_check -s exit:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a b
- atf_check -s eq:0 -o ignore -e empty grep "Not a directory" stderr
- atf_check -s eq:0 -o empty -e empty test -d a
- atf_check -s eq:0 -o empty -e empty test -f b
+ atf_check -s exit:0 -o ignore -e empty grep "Not a directory" stderr
+ atf_check -s exit:0 -o empty -e empty test -d a
+ atf_check -s exit:0 -o empty -e empty test -f b
rmdir a
rm b
@@ -208,13 +208,13 @@ file_to_dir_head() {
file_to_dir_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty mkdir b
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty mkdir b
+ atf_check -s exit:1 -o empty -e save:stderr \
$(atf_get_srcdir)/h_tools rename a b
- atf_check -s eq:0 -o ignore -e empty grep "Is a directory" stderr
- atf_check -s eq:0 -o empty -e empty test -f a
- atf_check -s eq:0 -o empty -e empty test -d b
+ atf_check -s exit:0 -o ignore -e empty grep "Is a directory" stderr
+ atf_check -s exit:0 -o empty -e empty test -f a
+ atf_check -s exit:0 -o empty -e empty test -d b
rm a
rmdir b
@@ -230,34 +230,34 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
- atf_check -s eq:0 -o empty -e empty touch dir/a
+ atf_check -s exit:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty touch dir/a
echo 'mv dir/a dir/b' | kqueue_monitor 2 dir dir/a
kqueue_check dir/a NOTE_RENAME
kqueue_check dir NOTE_WRITE
- atf_check -s eq:0 -o empty -e empty rm dir/b
- atf_check -s eq:0 -o empty -e empty rmdir dir
+ atf_check -s exit:0 -o empty -e empty rm dir/b
+ atf_check -s exit:0 -o empty -e empty rmdir dir
- atf_check -s eq:0 -o empty -e empty mkdir dir
- atf_check -s eq:0 -o empty -e empty touch dir/a
- atf_check -s eq:0 -o empty -e empty touch dir/b
+ atf_check -s exit:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty touch dir/a
+ atf_check -s exit:0 -o empty -e empty touch dir/b
echo 'mv dir/a dir/b' | kqueue_monitor 3 dir dir/a dir/b
kqueue_check dir/a NOTE_RENAME
kqueue_check dir NOTE_WRITE
kqueue_check dir/b NOTE_DELETE
- atf_check -s eq:0 -o empty -e empty rm dir/b
- atf_check -s eq:0 -o empty -e empty rmdir dir
+ atf_check -s exit:0 -o empty -e empty rm dir/b
+ atf_check -s exit:0 -o empty -e empty rmdir dir
- atf_check -s eq:0 -o empty -e empty mkdir dir1
- atf_check -s eq:0 -o empty -e empty mkdir dir2
- atf_check -s eq:0 -o empty -e empty touch dir1/a
+ atf_check -s exit:0 -o empty -e empty mkdir dir1
+ atf_check -s exit:0 -o empty -e empty mkdir dir2
+ atf_check -s exit:0 -o empty -e empty touch dir1/a
echo 'mv dir1/a dir2/a' | kqueue_monitor 3 dir1 dir1/a dir2
kqueue_check dir1/a NOTE_RENAME
kqueue_check dir1 NOTE_WRITE
kqueue_check dir2 NOTE_WRITE
- atf_check -s eq:0 -o empty -e empty rm dir2/a
- atf_check -s eq:0 -o empty -e empty rmdir dir1
- atf_check -s eq:0 -o empty -e empty rmdir dir2
+ atf_check -s exit:0 -o empty -e empty rm dir2/a
+ atf_check -s exit:0 -o empty -e empty rmdir dir1
+ atf_check -s exit:0 -o empty -e empty rmdir dir2
test_unmount
}
diff --git a/fs/tmpfs/t_rmdir.sh b/fs/tmpfs/t_rmdir.sh
index 9e5d761edf6c..fa5ae6835c3d 100644
--- a/fs/tmpfs/t_rmdir.sh
+++ b/fs/tmpfs/t_rmdir.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_rmdir.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_rmdir.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,7 +38,7 @@ mntpt_head() {
mntpt_body() {
test_mount
- atf_check -s eq:1 -o empty -e ignore rmdir ${Mount_Point}
+ atf_check -s exit:1 -o empty -e ignore rmdir ${Mount_Point}
test_unmount
}
@@ -52,7 +52,7 @@ non_existent_head() {
non_existent_body() {
test_mount
- atf_check -s eq:1 -o empty -e ignore rmdir non-existent
+ atf_check -s exit:1 -o empty -e ignore rmdir non-existent
test_unmount
}
@@ -65,11 +65,11 @@ single_head() {
single_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 3 ] || \
atf_fail "Incorrect number of links after creation"
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty rmdir a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 2 ] || \
atf_fail "Incorrect number of links after removal"
@@ -85,10 +85,10 @@ nested_head() {
nested_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir -p a/b/c
- atf_check -s eq:0 -o empty -e empty rmdir a/b/c
- atf_check -s eq:0 -o empty -e empty rmdir a/b
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty mkdir -p a/b/c
+ atf_check -s exit:0 -o empty -e empty rmdir a/b/c
+ atf_check -s exit:0 -o empty -e empty rmdir a/b
+ atf_check -s exit:0 -o empty -e empty rmdir a
test_unmount
}
@@ -101,10 +101,10 @@ dots_head() {
dots_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:1 -o empty -e ignore rmdir a/.
- atf_check -s eq:1 -o empty -e ignore rmdir a/..
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:1 -o empty -e ignore rmdir a/.
+ atf_check -s exit:1 -o empty -e ignore rmdir a/..
+ atf_check -s exit:0 -o empty -e empty rmdir a
test_unmount
}
@@ -117,13 +117,13 @@ non_empty_head() {
non_empty_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty mkdir a/b
- atf_check -s eq:0 -o empty -e empty mkdir a/c
- atf_check -s eq:1 -o empty -e ignore rmdir a
- atf_check -s eq:0 -o empty -e empty rmdir a/b
- atf_check -s eq:0 -o empty -e empty rmdir a/c
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a/b
+ atf_check -s exit:0 -o empty -e empty mkdir a/c
+ atf_check -s exit:1 -o empty -e ignore rmdir a
+ atf_check -s exit:0 -o empty -e empty rmdir a/b
+ atf_check -s exit:0 -o empty -e empty rmdir a/c
+ atf_check -s exit:0 -o empty -e empty rmdir a
test_unmount
}
@@ -136,13 +136,13 @@ links_head() {
links_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
- atf_check -s eq:0 -o empty -e empty mkdir a/b
- atf_check -s eq:0 -o empty -e empty mkdir c
+ atf_check -s exit:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a/b
+ atf_check -s exit:0 -o empty -e empty mkdir c
- atf_check -s eq:0 -o empty -e empty rmdir c
- atf_check -s eq:0 -o empty -e empty rmdir a/b
- atf_check -s eq:0 -o empty -e empty rmdir a
+ atf_check -s exit:0 -o empty -e empty rmdir c
+ atf_check -s exit:0 -o empty -e empty rmdir a/b
+ atf_check -s exit:0 -o empty -e empty rmdir a
eval $(stat -s ${Mount_Point})
[ ${st_nlink} = 2 ] || atf_fail "Incorrect number of links"
@@ -158,12 +158,12 @@ curdir_head() {
curdir_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a
+ atf_check -s exit:0 -o empty -e empty mkdir a
# Catch a bug that would panic the system when accessing the
# current directory after being deleted: vop_open cannot assume
# that open files are still linked to a directory.
- atf_check -s eq:1 -o empty -e ignore -x '( cd a && rmdir ../a && ls )'
- atf_check -s eq:1 -o empty -e empty test -e a
+ atf_check -s exit:1 -o empty -e ignore -x '( cd a && rmdir ../a && ls )'
+ atf_check -s exit:1 -o empty -e empty test -e a
test_unmount
}
@@ -177,13 +177,13 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
- atf_check -s eq:0 -o empty -e empty mkdir dir/a
+ atf_check -s exit:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir/a
echo 'rmdir dir/a' | kqueue_monitor 3 dir dir/a
kqueue_check dir/a NOTE_DELETE
kqueue_check dir NOTE_LINK
kqueue_check dir NOTE_WRITE
- atf_check -s eq:0 -o empty -e empty rmdir dir
+ atf_check -s exit:0 -o empty -e empty rmdir dir
test_unmount
}
diff --git a/fs/tmpfs/t_setattr.sh b/fs/tmpfs/t_setattr.sh
index f64344646e48..a5a2e3c9d984 100644
--- a/fs/tmpfs/t_setattr.sh
+++ b/fs/tmpfs/t_setattr.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_setattr.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_setattr.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,9 +38,9 @@ chown_head() {
chown_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir own
+ atf_check -s exit:0 -o empty -e empty mkdir own
eval $(stat -s own | sed -e 's|st_|ost_|g')
- atf_check -s eq:0 -o empty -e empty chown 1234 own
+ atf_check -s exit:0 -o empty -e empty chown 1234 own
eval $(stat -s own)
[ ${st_uid} -eq 1234 ] || atf_fail "uid was not set"
[ ${st_gid} -eq ${ost_gid} ] || atf_fail "gid was modified"
@@ -57,7 +57,7 @@ chown_kqueue_head() {
chown_kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir ownq
+ atf_check -s exit:0 -o empty -e empty mkdir ownq
echo 'chown 1234 ownq' | kqueue_monitor 1 ownq
kqueue_check ownq NOTE_ATTRIB
@@ -72,9 +72,9 @@ chgrp_head() {
chgrp_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir grp
+ atf_check -s exit:0 -o empty -e empty mkdir grp
eval $(stat -s grp | sed -e 's|st_|ost_|g')
- atf_check -s eq:0 -o empty -e empty chgrp 5678 grp
+ atf_check -s exit:0 -o empty -e empty chgrp 5678 grp
eval $(stat -s grp)
[ ${st_uid} -eq ${ost_uid} ] || atf_fail "uid was modified"
[ ${st_gid} -eq 5678 ] || atf_fail "gid was not set"
@@ -91,7 +91,7 @@ chgrp_kqueue_head() {
chgrp_kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir grpq
+ atf_check -s exit:0 -o empty -e empty mkdir grpq
echo 'chgrp 1234 grpq' | kqueue_monitor 1 grpq
kqueue_check grpq NOTE_ATTRIB
@@ -107,8 +107,8 @@ chowngrp_head() {
chowngrp_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir owngrp
- atf_check -s eq:0 -o empty -e empty chown 1234:5678 owngrp
+ atf_check -s exit:0 -o empty -e empty mkdir owngrp
+ atf_check -s exit:0 -o empty -e empty chown 1234:5678 owngrp
eval $(stat -s owngrp)
[ ${st_uid} -eq 1234 ] || atf_fail "uid was not modified"
[ ${st_gid} -eq 5678 ] || atf_fail "gid was not modified"
@@ -125,7 +125,7 @@ chowngrp_kqueue_head() {
chowngrp_kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir owngrpp
+ atf_check -s exit:0 -o empty -e empty mkdir owngrpp
echo 'chown 1234:5678 owngrpp' | kqueue_monitor 1 owngrpp
kqueue_check owngrpp NOTE_ATTRIB
@@ -140,8 +140,8 @@ chmod_head() {
chmod_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir mode
- atf_check -s eq:0 -o empty -e empty chmod 0000 mode
+ atf_check -s exit:0 -o empty -e empty mkdir mode
+ atf_check -s exit:0 -o empty -e empty chmod 0000 mode
eval $(stat -s mode)
[ ${st_mode} -eq 40000 ] || af_fail "mode was not set"
@@ -157,7 +157,7 @@ chmod_kqueue_head() {
chmod_kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir modeq
+ atf_check -s exit:0 -o empty -e empty mkdir modeq
echo 'chmod 0000 modeq' | kqueue_monitor 1 modeq
kqueue_check modeq NOTE_ATTRIB
@@ -172,8 +172,8 @@ chtimes_head() {
chtimes_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir times
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty mkdir times
+ atf_check -s exit:0 -o empty -e empty \
-x 'TZ=GMT touch -t 200501010101 times'
eval $(stat -s times)
[ ${st_atime} = ${st_mtime} ] || \
@@ -192,7 +192,7 @@ chtimes_kqueue_head() {
chtimes_kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir timesq
+ atf_check -s exit:0 -o empty -e empty mkdir timesq
echo 'touch timesq' | kqueue_monitor 1 timesq
kqueue_check timesq NOTE_ATTRIB
diff --git a/fs/tmpfs/t_sizes.sh b/fs/tmpfs/t_sizes.sh
index b23881167c29..782ededa3107 100644
--- a/fs/tmpfs/t_sizes.sh
+++ b/fs/tmpfs/t_sizes.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_sizes.sh,v 1.6 2018/01/17 00:23:17 maya Exp $
+# $NetBSD: t_sizes.sh,v 1.7 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -41,7 +41,7 @@ small_body() {
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
[ ${f_bused} -gt 1 ] || atf_fail "Incorrect bused count"
- atf_check -s eq:0 -o empty -e empty rm a
+ atf_check -s exit:0 -o empty -e empty rm a
test_unmount
}
@@ -58,7 +58,7 @@ big_body() {
eval $($(atf_get_srcdir)/h_tools statvfs . | sed -e 's|^f_|cf_|')
cf_bused=$((${cf_blocks} - ${cf_bfree}))
- atf_check -s eq:0 -o ignore -e ignore \
+ atf_check -s exit:0 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1m count=5
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
@@ -66,7 +66,7 @@ big_body() {
[ ${f_bused} -gt $((5 * 1024 * 1024 / ${pagesize})) ] || \
atf_fail "bused too big"
of_bused=${f_bused}
- atf_check -s eq:0 -o empty -e empty rm a
+ atf_check -s exit:0 -o empty -e empty rm a
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
[ ${f_bused} -lt ${of_bused} ] || \
@@ -84,13 +84,13 @@ overflow_head() {
overflow_body() {
test_mount -o -s10M
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty rm a
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty rm a
eval $($(atf_get_srcdir)/h_tools statvfs .)
of_bused=$((${f_blocks} - ${f_bfree}))
- atf_check -s eq:1 -o ignore -e ignore \
+ atf_check -s exit:1 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1m count=15
- atf_check -s eq:0 -o empty -e empty rm a
+ atf_check -s exit:0 -o empty -e empty rm a
eval $($(atf_get_srcdir)/h_tools statvfs .)
f_bused=$((${f_blocks} - ${f_bfree}))
[ ${f_bused} -ge ${of_bused} -a ${f_bused} -le $((${of_bused} + 1)) ] \
@@ -108,10 +108,10 @@ overwrite_head() {
overwrite_body() {
test_mount -o -s10M
- atf_check -s eq:0 -o ignore -e ignore \
+ atf_check -s exit:0 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1024 count=10
sync
- atf_check -s eq:0 -o ignore -e ignore \
+ atf_check -s exit:0 -o ignore -e ignore \
dd if=/dev/zero of=a bs=1024 conv=notrunc seek=1 count=1
sync
eval $(stat -s a)
diff --git a/fs/tmpfs/t_sockets.sh b/fs/tmpfs/t_sockets.sh
index 6b972483513c..4fdbdc73fa01 100644
--- a/fs/tmpfs/t_sockets.sh
+++ b/fs/tmpfs/t_sockets.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_sockets.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_sockets.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -34,10 +34,10 @@ basic_head() {
basic_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty $(atf_get_srcdir)/h_tools sockets a
- atf_check -s eq:0 -o empty -e empty rm a
+ atf_check -s exit:0 -o empty -e empty $(atf_get_srcdir)/h_tools sockets a
+ atf_check -s exit:0 -o empty -e empty rm a
- atf_check -s eq:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir
echo "$(atf_get_srcdir)/h_tools sockets dir/a" | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
diff --git a/fs/tmpfs/t_symlink.sh b/fs/tmpfs/t_symlink.sh
index 2cc66c06b4a6..232ebbd8e46b 100644
--- a/fs/tmpfs/t_symlink.sh
+++ b/fs/tmpfs/t_symlink.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_symlink.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_symlink.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -37,12 +37,12 @@ file_head() {
file_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch a
- atf_check -s eq:0 -o empty -e empty ln -s a b
+ atf_check -s exit:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty ln -s a b
[ $(md5 b | cut -d ' ' -f 4) = d41d8cd98f00b204e9800998ecf8427e ] || \
atf_fail "Symlink points to an incorrect file"
- atf_check -s eq:0 -o empty -e empty -x 'echo foo >a'
+ atf_check -s exit:0 -o empty -e empty -x 'echo foo >a'
[ $(md5 b | cut -d ' ' -f 4) = d3b07384d113edec49eaa6238ad5ff00 ] || \
atf_fail "Symlink points to an incorrect file"
@@ -58,10 +58,10 @@ exec_head() {
exec_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch b
- atf_check -s eq:0 -o empty -e empty ln -s /bin/cp cp
- atf_check -s eq:0 -o empty -e empty ./cp b c
- atf_check -s eq:0 -o empty -e empty test -f c
+ atf_check -s exit:0 -o empty -e empty touch b
+ atf_check -s exit:0 -o empty -e empty ln -s /bin/cp cp
+ atf_check -s exit:0 -o empty -e empty ./cp b c
+ atf_check -s exit:0 -o empty -e empty test -f c
test_unmount
}
@@ -74,13 +74,13 @@ dir_head() {
dir_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir d
- atf_check -s eq:1 -o empty -e empty test -f d/foo
- atf_check -s eq:1 -o empty -e empty test -f e/foo
- atf_check -s eq:0 -o empty -e empty ln -s d e
- atf_check -s eq:0 -o empty -e empty touch d/foo
- atf_check -s eq:0 -o empty -e empty test -f d/foo
- atf_check -s eq:0 -o empty -e empty test -f e/foo
+ atf_check -s exit:0 -o empty -e empty mkdir d
+ atf_check -s exit:1 -o empty -e empty test -f d/foo
+ atf_check -s exit:1 -o empty -e empty test -f e/foo
+ atf_check -s exit:0 -o empty -e empty ln -s d e
+ atf_check -s exit:0 -o empty -e empty touch d/foo
+ atf_check -s exit:0 -o empty -e empty test -f d/foo
+ atf_check -s exit:0 -o empty -e empty test -f e/foo
test_unmount
}
@@ -94,11 +94,11 @@ kqueue_head() {
kqueue_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir dir
+ atf_check -s exit:0 -o empty -e empty mkdir dir
echo 'ln -s non-existent dir/a' | kqueue_monitor 1 dir
kqueue_check dir NOTE_WRITE
- atf_check -s eq:0 -o empty -e empty rm dir/a
- atf_check -s eq:0 -o empty -e empty rmdir dir
+ atf_check -s exit:0 -o empty -e empty rm dir/a
+ atf_check -s exit:0 -o empty -e empty rmdir dir
test_unmount
}
diff --git a/fs/tmpfs/t_times.sh b/fs/tmpfs/t_times.sh
index b928f82ebb47..6f3aaf91d322 100644
--- a/fs/tmpfs/t_times.sh
+++ b/fs/tmpfs/t_times.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_times.sh,v 1.6 2021/06/17 00:03:05 riastradh Exp $
+# $NetBSD: t_times.sh,v 1.8 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,7 +38,7 @@ empty_head() {
empty_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty touch a
+ atf_check -s exit:0 -o empty -e empty touch a
eval $(stat -s a | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
[ ${ost_birthtime} -eq ${ost_atime} ] || \
atf_fail "Incorrect atime: ${ost_birthtime} != ${ost_atime}"
@@ -48,7 +48,7 @@ empty_body() {
atf_fail "Incorrect mtime: ${ost_birthtime} != ${ost_mtime}"
sleep 1
- atf_check -s eq:0 -o ignore -e empty cat a
+ atf_check -s exit:0 -o empty -e empty cat a
eval $(stat -s a) || atf_fail "stat failed"
[ ${st_atime} -gt ${ost_atime} ] || \
atf_fail "Incorrect atime: ${st_atime} <= ${ost_atime}"
@@ -83,7 +83,7 @@ non_empty_body() {
eval $(stat -s b | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
sleep 1
- atf_check -s eq:0 -o ignore -e empty cat b
+ atf_check -s exit:0 -o inline:"foo\n" -e empty cat b
eval $(stat -s b) || atf_fail "stat failed"
[ ${st_atime} -gt ${ost_atime} ] || \
atf_fail "Incorrect atime: ${st_atime} <= ${ost_atime}"
@@ -108,7 +108,7 @@ link_body() {
eval $(stat -s c | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
sleep 1
- atf_check -s eq:0 -o empty -e empty ln c d
+ atf_check -s exit:0 -o empty -e empty ln c d
eval $(stat -s c) || atf_fail "stat failed"
[ ${st_atime} -eq ${ost_atime} ] || \
atf_fail "Incorrect atime: ${st_atime} != ${ost_atime}"
@@ -129,12 +129,12 @@ rename_head() {
rename_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir e
+ atf_check -s exit:0 -o empty -e empty mkdir e
echo foo >e/a || atf_fail "Creation failed"
eval $(stat -s e | sed -e 's|st_|dost_|g') || atf_fail "stat failed"
eval $(stat -s e/a | sed -e 's|st_|ost_|g') || atf_fail "stat failed"
sleep 1
- atf_check -s eq:0 -o empty -e empty mv e/a e/b
+ atf_check -s exit:0 -o empty -e empty mv e/a e/b
eval $(stat -s e | sed -e 's|st_|dst_|g') || atf_fail "stat failed"
eval $(stat -s e/b) || atf_fail "stat failed"
[ ${st_atime} -eq ${ost_atime} ] || \
diff --git a/fs/tmpfs/t_trail_slash.sh b/fs/tmpfs/t_trail_slash.sh
index df5b023711bb..038354c6917d 100644
--- a/fs/tmpfs/t_trail_slash.sh
+++ b/fs/tmpfs/t_trail_slash.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_trail_slash.sh,v 1.5 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_trail_slash.sh,v 1.6 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,11 +35,11 @@ main_head() {
main_body() {
test_mount
- atf_check -s eq:0 -o empty -e empty mkdir a/
- atf_check -s eq:0 -o empty -e empty touch a/b
- atf_check -s eq:0 -o empty -e empty test -f a/b
- atf_check -s eq:0 -o empty -e empty rm a/b
- atf_check -s eq:0 -o empty -e empty rmdir a/
+ atf_check -s exit:0 -o empty -e empty mkdir a/
+ atf_check -s exit:0 -o empty -e empty touch a/b
+ atf_check -s exit:0 -o empty -e empty test -f a/b
+ atf_check -s exit:0 -o empty -e empty rm a/b
+ atf_check -s exit:0 -o empty -e empty rmdir a/
test_unmount
}
diff --git a/fs/tmpfs/t_truncate.sh b/fs/tmpfs/t_truncate.sh
index 2bc1902795cb..f10dde1bccbc 100644
--- a/fs/tmpfs/t_truncate.sh
+++ b/fs/tmpfs/t_truncate.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_truncate.sh,v 1.4 2010/11/07 17:51:18 jmmv Exp $
+# $NetBSD: t_truncate.sh,v 1.5 2025/01/07 17:36:45 andvar Exp $
#
# Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -35,7 +35,7 @@ basic_body() {
echo "Creating big file"
jot 10000 >a || atf_fail "Failed to create big file"
- echo "Trunctaing the file to a smaller size"
+ echo "Truncating the file to a smaller size"
echo foo >a || atf_fail "Failed to truncate file to a smaller size"
[ $(md5 a | cut -d ' ' -f 4) = d3b07384d113edec49eaa6238ad5ff00 ] || \
echo "Truncated file is incorrect"
diff --git a/fs/tmpfs/t_vnd.sh b/fs/tmpfs/t_vnd.sh
index 57d9a52d14d6..a8ee125aea7c 100644
--- a/fs/tmpfs/t_vnd.sh
+++ b/fs/tmpfs/t_vnd.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_vnd.sh,v 1.12 2022/11/30 17:50:00 martin Exp $
+# $NetBSD: t_vnd.sh,v 1.16 2025/04/19 02:07:43 rin Exp $
#
# Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -29,7 +29,8 @@
#
vnddev=vnd3
-vnd=/dev/${vnddev}
+rvnd=/dev/r${vnddev}a
+vnd=/dev/${vnddev}a
atf_test_case basic cleanup
basic_head() {
@@ -37,16 +38,30 @@ basic_head() {
atf_set "require.user" "root"
}
basic_body() {
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
+
test_mount
- atf_check -s eq:0 -o ignore -e ignore \
+ atf_check -s exit:0 -o ignore -e ignore \
dd if=/dev/zero of=disk.img bs=1m count=10
- atf_check -s eq:0 -o empty -e empty vndconfig -c ${vnddev} disk.img
+ atf_check -s exit:0 -o empty -e empty vndconfig -c ${vnddev} disk.img
+
+ atf_check -s exit:0 -o ignore -e ignore disklabel -i -I ${vnddev} << EOF
+a
+4.2BSD
+0
+$
+W
+y
+Q
+EOF
+ atf_check -s exit:0 -o ignore -e ignore newfs -I ${rvnd}
- atf_check -s eq:0 -o ignore -e ignore newfs -I ${vnd}
- atf_check -s eq:0 -o empty -e empty mkdir mnt
- atf_check -s eq:0 -o empty -e empty mount ${vnd} mnt
+ atf_check -s exit:0 -o empty -e empty mkdir mnt
+ atf_check -s exit:0 -o empty -e empty mount ${vnd} mnt
echo "Creating test files"
for f in $(jot -w %u 100 | uniq); do
@@ -60,8 +75,8 @@ basic_body() {
atf_fail "Invalid checksum for file ${f}"
done
- atf_check -s eq:0 -o empty -e empty umount mnt
- atf_check -s eq:0 -o empty -e empty vndconfig -u ${vnddev}
+ atf_check -s exit:0 -o empty -e empty umount mnt
+ atf_check -s exit:0 -o empty -e empty vndconfig -u ${vnddev}
test_unmount
touch done
diff --git a/fs/tmpfs/t_vnode_leak.sh b/fs/tmpfs/t_vnode_leak.sh
index 3f0dc5cc7c9e..7dd3fe8a37f7 100644
--- a/fs/tmpfs/t_vnode_leak.sh
+++ b/fs/tmpfs/t_vnode_leak.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_vnode_leak.sh,v 1.7 2018/01/17 00:23:17 maya Exp $
+# $NetBSD: t_vnode_leak.sh,v 1.8 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -37,7 +37,7 @@ main_head() {
main_body() {
echo "Lowering kern.maxvnodes to 2000"
sysctl -n kern.maxvnodes >oldvnodes
- atf_check -s eq:0 -o ignore -e empty sysctl -w kern.maxvnodes=2000
+ atf_check -s exit:0 -o ignore -e empty sysctl -w kern.maxvnodes=2000
test_mount -o -s$(((4000 + 2) * 4096))
echo "Creating 4000 directories"
diff --git a/fs/union/t_pr.c b/fs/union/t_pr.c
index 7c957742345d..b9fa61ad3307 100644
--- a/fs/union/t_pr.c
+++ b/fs/union/t_pr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_pr.c,v 1.13 2019/07/16 17:29:17 martin Exp $ */
+/* $NetBSD: t_pr.c,v 1.14 2025/04/13 02:10:30 riastradh Exp $ */
#include <sys/types.h>
#include <sys/mount.h>
@@ -229,6 +229,45 @@ ATF_TC_BODY(devnull2, tc)
atf_tc_fail("write");
}
+ATF_TC(pr1677_lowerunsearchabledot);
+ATF_TC_HEAD(pr1677_lowerunsearchabledot, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Lookup of `.' when searchable in upper, unsearchable in lower");
+}
+
+ATF_TC_BODY(pr1677_lowerunsearchabledot, tc)
+{
+ struct union_args unionargs;
+ struct stat sb;
+
+ rump_init();
+
+ RL(rump_sys_mkdir("/lower", 0777));
+ RL(rump_sys_mkdir("/lower/foo", 0700)); /* restricted */
+
+ RL(rump_sys_mkdir("/upper", 0777));
+ RL(rump_sys_mkdir("/upper/foo", 0777));
+
+ memset(&unionargs, 0, sizeof(unionargs));
+ unionargs.target = __UNCONST("/upper");
+ unionargs.mntflags = UNMNT_ABOVE;
+ RL(rump_sys_mount(MOUNT_UNION, "/lower", 0,
+ &unionargs, sizeof(unionargs)));
+
+ /* pretend we're an unprivileged process */
+ rump_pub_lwproc_rfork(RUMP_RFCFDG);
+ RL(rump_sys_setgid(1));
+ RL(rump_sys_setegid(1));
+ RL(rump_sys_setuid(32767));
+ RL(rump_sys_seteuid(32767));
+ atf_tc_expect_signal(SIGABRT, "PR kern/1677:"
+ " union FS can return bogus value for lookup of `.',"
+ " causing later panic");
+ RL(rump_sys_lstat("/lower/foo/.", &sb));
+ rump_pub_lwproc_releaselwp();
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, multilayer);
@@ -237,6 +276,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, cyclic2);
ATF_TP_ADD_TC(tp, devnull1);
ATF_TP_ADD_TC(tp, devnull2);
+ ATF_TP_ADD_TC(tp, pr1677_lowerunsearchabledot);
return atf_no_error();
}
diff --git a/fs/vfs/t_vfsops.c b/fs/vfs/t_vfsops.c
index bbed9f9d3089..9fab116bb317 100644
--- a/fs/vfs/t_vfsops.c
+++ b/fs/vfs/t_vfsops.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_vfsops.c,v 1.12 2017/01/13 21:30:40 christos Exp $ */
+/* $NetBSD: t_vfsops.c,v 1.13 2025/11/01 04:10:47 perseant Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -146,9 +146,6 @@ tfhremove(const atf_tc_t *tc, const char *path)
RL(rump_sys_getfh(FNAME, fhp, &fhsize));
RL(rump_sys_unlink(FNAME));
- if (FSTYPE_LFS(tc))
- atf_tc_expect_fail("fhopen() for removed file succeeds "
- "(PR kern/43745)");
ATF_REQUIRE_ERRNO(ESTALE, rump_sys_fhopen(fhp, fhsize, O_RDONLY) == -1);
atf_tc_expect_pass();
diff --git a/games/Makefile b/games/Makefile
index da9c220ee406..6b8139f0a556 100644
--- a/games/Makefile
+++ b/games/Makefile
@@ -1,9 +1,10 @@
-# $NetBSD: Makefile,v 1.2 2007/11/21 15:39:34 jmmv Exp $
+# $NetBSD: Makefile,v 1.3 2024/06/16 18:40:58 rillig Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/games
TESTS_SH= t_factor
+TESTS_SH+= t_morse
.include <bsd.test.mk>
diff --git a/games/t_factor.sh b/games/t_factor.sh
index 1452a7f1b6ee..fb0ec0d238d8 100644
--- a/games/t_factor.sh
+++ b/games/t_factor.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_factor.sh,v 1.11 2020/10/11 18:43:50 christos Exp $
+# $NetBSD: t_factor.sh,v 1.12 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -31,7 +31,7 @@ expect() {
if [ -n "$3" ] && [ $ncrypt -eq 0 ] ; then
atf_skip "crypto needed for huge non-prime factors - PR bin/23663"
fi
- atf_check -s eq:0 -o file:expout -e empty /usr/games/factor ${1}
+ atf_check -s exit:0 -o file:expout -e empty /usr/games/factor ${1}
}
atf_test_case overflow1
diff --git a/include/Makefile b/include/Makefile
index 2c1b44b82d46..c0c715288a99 100644
--- a/include/Makefile
+++ b/include/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.10 2011/05/26 12:56:32 joerg Exp $
+# $NetBSD: Makefile,v 1.11 2025/04/01 00:33:55 riastradh Exp $
NOMAN= # defined
@@ -14,6 +14,7 @@ TESTS_C+= t_inttypes
TESTS_C+= t_limits
TESTS_C+= t_netdb
TESTS_C+= t_paths
+TESTS_C+= t_stddef
TESTS_C+= t_stdint
FILESDIR= ${TESTSDIR}
diff --git a/include/sys/Makefile b/include/sys/Makefile
index 25755bebfe3d..c20f39f1a131 100644
--- a/include/sys/Makefile
+++ b/include/sys/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.16 2020/05/31 16:36:07 kamil Exp $
+# $NetBSD: Makefile,v 1.17 2024/11/01 18:35:12 riastradh Exp $
NOMAN= # defined
@@ -14,6 +14,10 @@ TESTS_C+= t_pslist
TESTS_C+= t_tree
TESTS_C+= t_types
+COPTS.t_bitops.c+= -fno-builtin-ffs
+COPTS.t_bitops.c+= -fno-builtin-ffsl
+COPTS.t_bitops.c+= -fno-builtin-ffsll
+
# NULL + 0 arithmetic raises LLVM UBSan warnings, specially in sys/pslist.h
# in the type-safe macros _PSLIST_VALIDATE_PTRS and _PSLIST_VALIDATE_CONTAINER.
# See also src/sys/rump/Makefile.rump
diff --git a/include/sys/t_bitops.c b/include/sys/t_bitops.c
index 6bddd07d7573..2b61df84da82 100644
--- a/include/sys/t_bitops.c
+++ b/include/sys/t_bitops.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_bitops.c,v 1.21 2023/07/13 20:39:24 riastradh Exp $ */
+/* $NetBSD: t_bitops.c,v 1.22 2024/11/01 18:35:12 riastradh Exp $ */
/*-
* Copyright (c) 2011, 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_bitops.c,v 1.21 2023/07/13 20:39:24 riastradh Exp $");
+__RCSID("$NetBSD: t_bitops.c,v 1.22 2024/11/01 18:35:12 riastradh Exp $");
#include <atf-c.h>
@@ -40,6 +40,7 @@ __RCSID("$NetBSD: t_bitops.c,v 1.21 2023/07/13 20:39:24 riastradh Exp $");
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
+#include <strings.h>
static const struct {
uint32_t val;
@@ -164,18 +165,65 @@ ATF_TC_BODY(ffsfls, tc)
uint8_t i;
int n, m;
+ ATF_CHECK_EQ_MSG((n = ffs(0)), 0x00, "n=%d", n);
+ ATF_CHECK_EQ_MSG((n = ffsl(0)), 0x00, "n=%d", n);
+ ATF_CHECK_EQ_MSG((n = ffsll(0)), 0x00, "n=%d", n);
+
ATF_CHECK_EQ_MSG((n = ffs32(0)), 0x00, "n=%d", n);
ATF_CHECK_EQ_MSG((n = fls32(0)), 0x00, "n=%d", n);
ATF_CHECK_EQ_MSG((n = ffs64(0)), 0x00, "n=%d", n);
ATF_CHECK_EQ_MSG((n = fls64(0)), 0x00, "n=%d", n);
+ ATF_CHECK_EQ_MSG((n = ffs(UINT_MAX)), 0x01, "n=%d\n", n);
+ ATF_CHECK_EQ_MSG((n = ffsl(ULONG_MAX)), 0x01, "n=%d\n", n);
+ ATF_CHECK_EQ_MSG((n = ffsll(ULLONG_MAX)), 0x01, "n=%d\n", n);
+
+ ATF_CHECK_EQ_MSG((n = ffs((unsigned)INT_MAX + 1)),
+ CHAR_BIT*sizeof(int),
+ "n=%d\n", n);
+ ATF_CHECK_EQ_MSG((n = ffsl((unsigned long)LONG_MAX + 1)),
+ CHAR_BIT*sizeof(long),
+ "n=%d\n", n);
+ ATF_CHECK_EQ_MSG((n = ffsll((unsigned long long)LLONG_MAX + 1)),
+ CHAR_BIT*sizeof(long long),
+ "n=%d\n", n);
+
ATF_CHECK_EQ_MSG((n = ffs32(UINT32_MAX)), 0x01, "n=%d", n);
ATF_CHECK_EQ_MSG((n = fls32(UINT32_MAX)), 0x20, "n=%d", n);
ATF_CHECK_EQ_MSG((n = ffs64(UINT64_MAX)), 0x01, "n=%d", n);
ATF_CHECK_EQ_MSG((n = fls64(UINT64_MAX)), 0x40, "n=%d", n);
+ for (i = 0; i < CHAR_BIT*sizeof(long long); i++) {
+ if (i < CHAR_BIT*sizeof(int)) {
+ ATF_CHECK_EQ_MSG((n = ffs(1U << i)), i + 1, "n=%d", n);
+ }
+ if (i < CHAR_BIT*sizeof(long)) {
+ ATF_CHECK_EQ_MSG((n = ffsl(1UL << i)), i + 1,
+ "n=%d", n);
+ }
+ if (i < CHAR_BIT*sizeof(long long)) {
+ ATF_CHECK_EQ_MSG((n = ffsll(1ULL << i)), i + 1,
+ "n=%d", n);
+ }
+ if (i < CHAR_BIT*sizeof(int32_t)) {
+ ATF_CHECK_EQ_MSG((n = ffs32((uint32_t)1 << i)), i + 1,
+ "n=%d", n);
+ }
+ if (i < CHAR_BIT*sizeof(int64_t)) {
+ ATF_CHECK_EQ_MSG((n = ffs64((uint64_t)1 << i)), i + 1,
+ "n=%d", n);
+ }
+ }
+
for (i = 1; i < __arraycount(bits); i++) {
+ ATF_CHECK_EQ_MSG((n = ffs(bits[i].val)), (m = bits[i].ffs),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffsl(bits[i].val)), (m = bits[i].ffs),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffsll(bits[i].val)), (m = bits[i].ffs),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+
ATF_CHECK_EQ_MSG((n = ffs32(bits[i].val)), (m = bits[i].ffs),
"[i=%"PRIu8"] n=%d m=%d", i, n, m);
ATF_CHECK_EQ_MSG((n = fls32(bits[i].val)), (m = bits[i].fls),
@@ -185,6 +233,16 @@ ATF_TC_BODY(ffsfls, tc)
ATF_CHECK_EQ_MSG((n = fls64(bits[i].val)), (m = bits[i].fls),
"[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffs(bits[i].val << 1)),
+ (m = bits[i].ffs + 1),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffsl(bits[i].val << 1)),
+ (m = bits[i].ffs + 1),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffsll(bits[i].val << 1)),
+ (m = bits[i].ffs + 1),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+
ATF_CHECK_EQ_MSG((n = ffs32(bits[i].val << 1)),
(m = bits[i].ffs + 1),
"[i=%"PRIu8"] n=%d m=%d", i, n, m);
@@ -198,6 +256,16 @@ ATF_TC_BODY(ffsfls, tc)
(m = bits[i].fls + 1),
"[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffs(bits[i].val << 9)),
+ (m = bits[i].ffs + 9),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffsl(bits[i].val << 9)),
+ (m = bits[i].ffs + 9),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+ ATF_CHECK_EQ_MSG((n = ffsll(bits[i].val << 9)),
+ (m = bits[i].ffs + 9),
+ "[i=%"PRIu8"] n=%d m=%d", i, n, m);
+
ATF_CHECK_EQ_MSG((n = ffs32(bits[i].val << 9)),
(m = bits[i].ffs + 9),
"[i=%"PRIu8"] n=%d m=%d", i, n, m);
diff --git a/include/sys/t_list.c b/include/sys/t_list.c
index d46e8e06acd0..1617927f91e7 100644
--- a/include/sys/t_list.c
+++ b/include/sys/t_list.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_list.c,v 1.2 2017/10/02 05:14:29 pgoyette Exp $ */
+/* $NetBSD: t_list.c,v 1.3 2024/07/10 20:52:32 rillig Exp $ */
/*-
* Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@ ATF_TC_BODY(list_move, tc)
memcpy(&old_copy, &old_head, sizeof(old_head));
n3 = LIST_FIRST(&new_head);
- ATF_CHECK_MSG(n3->value = 2, "Unexpected value for LIST_FIRST");
+ ATF_CHECK_MSG(n3->value == 2, "Unexpected value for LIST_FIRST");
LIST_REMOVE(n3, entries);
ATF_CHECK_MSG(memcmp(&old_copy, &old_head, sizeof(old_head)) == 0,
diff --git a/kernel/Makefile b/kernel/Makefile
index 2fc5f1d714ac..5a6ae5035498 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.75 2023/08/03 12:24:46 nia Exp $
+# $NetBSD: Makefile,v 1.96 2025/07/17 19:50:40 kre Exp $
NOMAN= # defined
@@ -7,51 +7,80 @@ NOMAN= # defined
TESTSDIR= ${TESTSBASE}/kernel
TESTS_SUBDIRS+= kqueue
-#TESTS_C= t_epoll
+TESTS_C+= t_cloexec
+TESTS_C+= t_clofork
+#TESTS_C+= t_epoll
+TESTS_C+= t_execregs
TESTS_C+= t_fcntl
+.if ${MKRUMP} != "no"
+TESTS_C+= t_fdrestart
+.endif
+TESTS_C+= t_kauth_pr_47598
+TESTS_C+= t_ksem
TESTS_C+= t_lock
TESTS_C+= t_lockf
-TESTS_C+= t_pty
TESTS_C+= t_memfd_create
TESTS_C+= t_mqueue
+TESTS_C+= t_nanosleep
+TESTS_C+= t_open_pr_57260
TESTS_C+= t_proccwd
+TESTS_C+= t_pty
+TESTS_C+= t_semtimedop
+TESTS_C+= t_signal_and_sp
TESTS_C+= t_sysv
TESTS_C+= t_subr_prf
-TESTS_C+= t_kauth_pr_47598
-TESTS_C+= t_ksem
TESTS_C+= t_sysctl
TESTS_C+= t_timeleft
+.if ${MKRUMP} != "no"
+TESTS_C+= t_unmount
+.endif
TESTS_C+= t_zombie
-TESTS_C+= t_open_pr_57260
-TESTS_SH= t_umount
-TESTS_SH+= t_umountstress
-TESTS_SH+= t_ps_strings
-TESTS_SH+= t_trapsignal
+TESTS_SH= t_fexecve
+TESTS_SH+= t_fpufork
TESTS_SH+= t_interp
TESTS_SH+= t_magic_symlinks
TESTS_SH+= t_nointerpreter
TESTS_SH+= t_origin
TESTS_SH+= t_procpath
-TESTS_SH+= t_fexecve
-TESTS_SH+= t_fpufork
+TESTS_SH+= t_ps_strings
+.if ${MKKMOD} != "no"
+TESTS_SH+= t_setjmp
+.endif
.if ${MKRUMP} != "no"
TESTS_SH+= t_simplehook
.endif
+TESTS_SH+= t_trapsignal
+TESTS_SH+= t_umountstress
+TESTS_SH+= t_umount
BINDIR= ${TESTSDIR}
-PROGS= h_fexecve
+PROGS+= h_cloexec
+PROGS+= h_execregs
+PROGS+= h_execsp_dynamic
+PROGS+= h_execsp_static
+PROGS+= h_fexecve
+PROGS+= h_fpufork
+PROGS+= h_getprocpath
PROGS+= h_ps_strings1
PROGS+= h_ps_strings2
PROGS+= h_segv
-PROGS+= h_getprocpath
-PROGS+= h_fpufork
SCRIPTSDIR= ${TESTSDIR}
SCRIPTS= h_interpreter.sh
+LDADD.t_fdrestart+= -lpthread
+LDADD.t_fdrestart+= -lrumpnet_local
+LDADD.t_fdrestart+= -lrumpnet_net
+LDADD.t_fdrestart+= -lrumpnet_netinet
+LDADD.t_fdrestart+= -lrumpnet
+LDADD.t_fdrestart+= ${LIBRUMPBASE}
+
LDADD.t_mqueue+= -lrt
+LDADD.t_unmount+= -lrumpfs_tmpfs
+LDADD.t_unmount+= ${LIBRUMPBASE}
+
.if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
TESTS_SUBDIRS+= tty
@@ -68,6 +97,52 @@ LDADD.t_rnd+= -lrumpdev_rnd -lrumpdev ${LIBRUMPBASE}
LDADD.t_timeleft+= -lpthread
CPPFLAGS+= -D_KERNTYPES
+CPPFLAGS.t_unmount.c+= -D_KMEMUSER -D__EXPOSE_MOUNT
+
+.if exists(${.PARSEDIR}/arch/${MACHINE_ARCH})
+ARCHDIR:= ${.PARSEDIR}/arch/${MACHINE_ARCH}
+.else
+ARCHDIR:= ${.PARSEDIR}/arch/${MACHINE_CPU}
+.endif
+.PATH: ${ARCHDIR}
+
+.if exists(${ARCHDIR}/stack_pointer.h)
+CPPFLAGS.t_signal_and_sp.c+= -I${ARCHDIR} -DHAVE_STACK_POINTER_H
+.endif
+
+SRCS.t_signal_and_sp+= t_signal_and_sp.c
+.if exists(${ARCHDIR}/contextspfunc.S)
+CPPFLAGS.t_signal_and_sp.c+= -DHAVE_CONTEXTSPFUNC
+SRCS.t_signal_and_sp+= contextspfunc.S
+.endif
+.if exists(${ARCHDIR}/signalsphandler.S)
+CPPFLAGS.t_signal_and_sp.c+= -DHAVE_SIGNALSPHANDLER
+SRCS.t_signal_and_sp+= signalsphandler.S
+.endif
+.if exists(${ARCHDIR}/threadspfunc.S)
+CPPFLAGS.t_signal_and_sp.c+= -DHAVE_THREADSPFUNC
+SRCS.t_signal_and_sp+= threadspfunc.S
+LDADD.t_signal_and_sp+= -pthread
+.endif
+
+SRCS.h_execsp_dynamic+= h_execsp.c
+SRCS.h_execsp_static+= h_execsp.c
+.if exists(${ARCHDIR}/execsp.S)
+CPPFLAGS.t_signal_and_sp.c+= -DHAVE_EXECSP
+SRCS.h_execsp_dynamic+= execsp.S
+SRCS.h_execsp_static+= execsp.S
+LDFLAGS.h_execsp_dynamic+= -Wl,-e,execsp_start
+LDFLAGS.h_execsp_static+= -Wl,-e,execsp_start
+.else
+CPPFLAGS.h_execsp.c+= -Dexecsp_main=main
+.endif
+LDSTATIC.h_execsp_static= -static
+
+.if ${MACHINE_CPU} == "mips"
+CPPFLAGS.contextspfunc.S+= -I${NETBSDSRCDIR}/lib/libc/arch/mips
+CPPFLAGS.execsp.S+= -I${NETBSDSRCDIR}/lib/libc/arch/mips
+CPPFLAGS.signalsphandler.S+= -I${NETBSDSRCDIR}/lib/libc/arch/mips
+.endif
.PATH: ${NETBSDSRCDIR}/sys/kern
TESTS_C+= t_extent
@@ -75,6 +150,12 @@ SRCS.t_extent= t_extent.c subr_extent.c
CPPFLAGS.t_extent.c= -D_EXTENT_TESTING -D__POOL_EXPOSE -D_KERNTYPES
CPPFLAGS.subr_extent.c= -D_EXTENT_TESTING -D__POOL_EXPOSE -D_KERNTYPES
+TESTS_C+= t_time_arith
+SRCS.t_time_arith= t_time_arith.c subr_time_arith.c
+CPPFLAGS.t_time_arith.c+= -I${NETBSDSRCDIR}/sys -D_TIME_TESTING
+CPPFLAGS.subr_time_arith.c+= -I${NETBSDSRCDIR}/sys -D_TIME_TESTING
+LDADD.t_time_arith+= -lutil
+
t_subr_prf.c: gen_t_subr_prf ${NETBSDSRCDIR}/sys/kern/subr_prf.c
${HOST_SH} ${.ALLSRC} ${.TARGET}
.if ${MKSANITIZER:Uno} == "yes"
@@ -99,4 +180,20 @@ CLEANFILES+= t_subr_prf.c
LDADD.h_segv+= -lm
+.if exists(arch/${MACHINE_ARCH}/execregs.h)
+CPPFLAGS.t_execregs.c+= -I${ARCHDIR}
+CPPFLAGS.t_execregs.c+= -I${.CURDIR}/../lib/libc/gen # isqemu.h
+CPPFLAGS.t_execregs.c+= -DHAVE_EXECREGS_TEST
+SRCS.t_execregs+= t_execregs.c
+SRCS.t_execregs+= execregs.c
+LDSTATIC.h_execregs= -static
+LDFLAGS.h_execregs+= -Wl,-e,execregs_start
+.else
+SRCS.h_execregs= h_execregs_unimpl.c
+.endif
+
+.if ${MKKMOD} != "no"
+SUBDIR+= setjmp_tester
+.endif
+
.include <bsd.test.mk>
diff --git a/kernel/h_segv.c b/kernel/h_segv.c
index 7a634da1df49..86ff492664f6 100644
--- a/kernel/h_segv.c
+++ b/kernel/h_segv.c
@@ -1,4 +1,4 @@
-/* $NetBSD: h_segv.c,v 1.14 2019/04/25 19:37:09 kamil Exp $ */
+/* $NetBSD: h_segv.c,v 1.15 2024/05/14 15:54:16 riastradh Exp $ */
/*-
* Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: h_segv.c,v 1.14 2019/04/25 19:37:09 kamil Exp $");
+__RCSID("$NetBSD: h_segv.c,v 1.15 2024/05/14 15:54:16 riastradh Exp $");
#define __TEST_FENV
@@ -121,10 +121,15 @@ check_fpe(void)
printf("FPU does not implement traps on FP exceptions\n");
exit(EXIT_FAILURE);
}
+#elif defined __riscv__
+ printf("RISC-V does not support floating-point exception traps\n");
+ exit(EXIT_FAILURE);
#endif
exit(EXIT_SUCCESS);
}
+volatile int ignore_result;
+
static void
trigger_fpe(void)
{
@@ -135,7 +140,13 @@ trigger_fpe(void)
feenableexcept(FE_ALL_EXCEPT);
#endif
- usleep((int)(a/b));
+ /*
+ * Try to trigger SIGFPE either by dividing by zero (which is
+ * defined to raise FE_DIVBYZERO, but may just return infinity
+ * without trapping the exception) or by converting infinity to
+ * integer.
+ */
+ ignore_result = (int)(a/b);
}
static void
diff --git a/kernel/kqueue/read/t_fifo.c b/kernel/kqueue/read/t_fifo.c
index 5dead2dd41ba..c9a2e32d5c0e 100644
--- a/kernel/kqueue/read/t_fifo.c
+++ b/kernel/kqueue/read/t_fifo.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fifo.c,v 1.5 2021/10/02 18:21:05 thorpej Exp $ */
+/* $NetBSD: t_fifo.c,v 1.6 2025/05/19 06:16:24 andvar Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2021\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_fifo.c,v 1.5 2021/10/02 18:21:05 thorpej Exp $");
+__RCSID("$NetBSD: t_fifo.c,v 1.6 2025/05/19 06:16:24 andvar Exp $");
#include <sys/event.h>
#include <sys/stat.h>
@@ -121,7 +121,7 @@ ATF_TC_BODY(fifo, tc)
ATF_REQUIRE((event[0].flags & EV_EOF) != 0);
/*
- * Reconect the writer. We expect EV_EOF to be cleared and
+ * Reconnect the writer. We expect EV_EOF to be cleared and
* for the FIFO to no longer be readable once again.
*/
ATF_REQUIRE((wfd = open(fifo_path, O_WRONLY | O_NONBLOCK)) >= 0);
diff --git a/kernel/kqueue/t_empty.c b/kernel/kqueue/t_empty.c
index e733e917c528..32381baf7576 100644
--- a/kernel/kqueue/t_empty.c
+++ b/kernel/kqueue/t_empty.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_empty.c,v 1.1 2021/10/23 01:28:33 thorpej Exp $ */
+/* $NetBSD: t_empty.c,v 1.2 2024/08/23 07:13:50 rin Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_empty.c,v 1.1 2021/10/23 01:28:33 thorpej Exp $");
+__RCSID("$NetBSD: t_empty.c,v 1.2 2024/08/23 07:13:50 rin Exp $");
#include <sys/event.h>
#include <sys/socket.h>
@@ -163,6 +163,9 @@ ATF_TC_BODY(sock_tcp, tc)
ATF_REQUIRE_ERRNO(EINPROGRESS,
connect(writesock, (struct sockaddr *)&sin, sizeof(sin)) == -1);
+ /* XXX Avoid race between connect(2) and accept(2). */
+ sleep(1);
+
slen = sizeof(sin);
ATF_REQUIRE((readsock = accept(readsock, (struct sockaddr *)&sin,
&slen)) != -1);
diff --git a/kernel/kqueue/t_sig.c b/kernel/kqueue/t_sig.c
index 9d29cb8ed383..9981963419e8 100644
--- a/kernel/kqueue/t_sig.c
+++ b/kernel/kqueue/t_sig.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sig.c,v 1.4 2021/10/10 18:11:31 thorpej Exp $ */
+/* $NetBSD: t_sig.c,v 1.5 2024/07/10 22:03:59 rillig Exp $ */
/*-
* Copyright (c) 2002, 2008, 2021 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_sig.c,v 1.4 2021/10/10 18:11:31 thorpej Exp $");
+__RCSID("$NetBSD: t_sig.c,v 1.5 2024/07/10 22:03:59 rillig Exp $");
#include <sys/event.h>
#include <sys/ioctl.h>
@@ -199,7 +199,7 @@ ATF_TC_BODY(sig_and_proc, tc)
ATF_REQUIRE(kevent(kq, NULL, 0, events, 1, NULL) == 1);
ATF_REQUIRE(events[0].filter == EVFILT_PROC);
ATF_REQUIRE(events[0].ident == (uintptr_t)pid);
- ATF_REQUIRE(events[0].fflags = NOTE_EXIT);
+ ATF_REQUIRE(events[0].fflags == NOTE_EXIT);
}
ATF_TP_ADD_TCS(tp)
diff --git a/kernel/t_memfd_create.c b/kernel/t_memfd_create.c
index 7457bec3ec90..b65807108dfb 100644
--- a/kernel/t_memfd_create.c
+++ b/kernel/t_memfd_create.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_memfd_create.c,v 1.2 2023/07/29 16:24:35 rin Exp $ */
+/* $NetBSD: t_memfd_create.c,v 1.7 2025/04/19 01:56:50 riastradh Exp $ */
/*-
* Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_memfd_create.c,v 1.2 2023/07/29 16:24:35 rin Exp $");
+__RCSID("$NetBSD: t_memfd_create.c,v 1.7 2025/04/19 01:56:50 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -43,8 +43,20 @@ __RCSID("$NetBSD: t_memfd_create.c,v 1.2 2023/07/29 16:24:35 rin Exp $");
#include "h_macros.h"
char name_buf[NAME_MAX];
-char write_buf[8192];
-char read_buf[8192];
+char *write_buf;
+char *read_buf;
+size_t rwbuf_size;
+
+static void
+setupbufs(void)
+{
+
+ rwbuf_size = (size_t)sysconf(_SC_PAGESIZE);
+ ATF_REQUIRE_MSG(rwbuf_size < SIZE_MAX/2, "rwbuf_size=%zu", rwbuf_size);
+ rwbuf_size *= 2;
+ REQUIRE_LIBC(write_buf = calloc(1, rwbuf_size), NULL);
+ REQUIRE_LIBC(read_buf = calloc(1, rwbuf_size), NULL);
+}
ATF_TC(create_null_name);
ATF_TC_HEAD(create_null_name, tc)
@@ -98,26 +110,27 @@ ATF_TC_BODY(read_write, tc)
int fd;
off_t offset;
+ setupbufs();
+
RL(fd = memfd_create("", 0));
- tests_makegarbage(write_buf, sizeof(write_buf));
- memset(read_buf, 0, sizeof(read_buf));
+ tests_makegarbage(write_buf, rwbuf_size);
- RL(write(fd, write_buf, sizeof(write_buf)));
+ RL(write(fd, write_buf, rwbuf_size));
offset = lseek(fd, 0, SEEK_CUR);
- ATF_REQUIRE_EQ_MSG(offset, sizeof(write_buf),
+ ATF_REQUIRE_EQ_MSG(offset, (off_t)rwbuf_size,
"File offset not set after write (%jd != %zu)", (intmax_t)offset,
- sizeof(write_buf));
+ rwbuf_size);
- RZ(lseek(fd, 0, SEEK_SET));
+ RL(lseek(fd, 0, SEEK_SET));
- RL(read(fd, read_buf, sizeof(read_buf)));
+ RL(read(fd, read_buf, rwbuf_size));
offset = lseek(fd, 0, SEEK_CUR);
- ATF_REQUIRE_EQ_MSG(offset, sizeof(read_buf),
+ ATF_REQUIRE_EQ_MSG(offset, (off_t)rwbuf_size,
"File offset not set after read (%jd != %zu)", (intmax_t)offset,
- sizeof(read_buf));
+ rwbuf_size);
- for (size_t i = 0; i < sizeof(read_buf); i++)
+ for (size_t i = 0; i < rwbuf_size; i++)
ATF_REQUIRE_EQ_MSG(read_buf[i], write_buf[i],
"Data read does not match data written");
}
@@ -134,37 +147,39 @@ ATF_TC_BODY(truncate, tc)
int fd;
struct stat st;
+ setupbufs();
+
RL(fd = memfd_create("", 0));
- tests_makegarbage(write_buf, sizeof(write_buf));
- tests_makegarbage(read_buf, sizeof(read_buf));
+ tests_makegarbage(write_buf, rwbuf_size);
+ tests_makegarbage(read_buf, rwbuf_size);
- RL(write(fd, write_buf, sizeof(write_buf)));
+ RL(write(fd, write_buf, rwbuf_size));
RL(fstat(fd, &st));
- ATF_REQUIRE_EQ_MSG(st.st_size, sizeof(write_buf),
- "Write did not grow size to %zu (is %jd)", sizeof(write_buf),
+ ATF_REQUIRE_EQ_MSG(st.st_size, (off_t)rwbuf_size,
+ "Write did not grow size to %zu (is %jd)", rwbuf_size,
(intmax_t)st.st_size);
- RL(ftruncate(fd, sizeof(write_buf)/2));
+ RL(ftruncate(fd, rwbuf_size/2));
RL(fstat(fd, &st));
- ATF_REQUIRE_EQ_MSG(st.st_size, sizeof(write_buf)/2,
+ ATF_REQUIRE_EQ_MSG(st.st_size, (off_t)rwbuf_size/2,
"Truncate did not shrink size to %zu (is %jd)",
- sizeof(write_buf)/2, (intmax_t)st.st_size);
+ rwbuf_size/2, (intmax_t)st.st_size);
- RL(ftruncate(fd, sizeof(read_buf)));
+ RL(ftruncate(fd, rwbuf_size));
RL(fstat(fd, &st));
- ATF_REQUIRE_EQ_MSG(st.st_size, sizeof(read_buf),
- "Truncate did not grow size to %zu (is %jd)", sizeof(read_buf),
+ ATF_REQUIRE_EQ_MSG(st.st_size, (off_t)rwbuf_size,
+ "Truncate did not grow size to %zu (is %jd)", rwbuf_size,
(intmax_t)st.st_size);
- RZ(lseek(fd, 0, SEEK_SET));
- RL(read(fd, read_buf, sizeof(read_buf)));
+ RL(lseek(fd, 0, SEEK_SET));
+ RL(read(fd, read_buf, rwbuf_size));
- for (size_t i = 0; i < sizeof(read_buf)/2; i++)
+ for (size_t i = 0; i < rwbuf_size/2; i++)
ATF_REQUIRE_EQ_MSG(read_buf[i], write_buf[i],
"Data read does not match data written");
- for (size_t i = sizeof(read_buf)/2; i < sizeof(read_buf); i++)
+ for (size_t i = rwbuf_size/2; i < rwbuf_size; i++)
ATF_REQUIRE_EQ_MSG(read_buf[i], 0,
"Data read on growed region is not zeroed");
}
@@ -180,12 +195,15 @@ ATF_TC_BODY(mmap, tc)
int fd;
void *addr;
+ setupbufs();
+
RL(fd = memfd_create("", 0));
- RL(ftruncate(fd, sizeof(read_buf)));
+ RL(ftruncate(fd, rwbuf_size));
- addr = mmap(NULL, sizeof(read_buf), PROT_READ|PROT_WRITE, MAP_SHARED,
- fd, 0);
- ATF_REQUIRE_MSG(addr != MAP_FAILED, "Mmap failed unexpectedly (%s)",
+ addr = mmap(NULL, rwbuf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+ ATF_REQUIRE_MSG(addr != MAP_FAILED,
+ "mmap(NULL, %zu, 0x%x, 0x%x, %d, 0) failed: %s",
+ rwbuf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd,
strerror(errno));
}
@@ -240,6 +258,8 @@ test_all_seals_except(int fd, int except)
struct stat st;
void *addr;
+ ATF_REQUIRE(rwbuf_size > 0);
+
RL(fstat(fd, &st));
ATF_REQUIRE(st.st_size > 0);
@@ -255,8 +275,8 @@ test_all_seals_except(int fd, int except)
}
if (except & ~(F_SEAL_WRITE|F_SEAL_FUTURE_WRITE)) {
- RZ(lseek(fd, 0, SEEK_SET));
- rv = write(fd, write_buf, sizeof(write_buf));
+ RL(lseek(fd, 0, SEEK_SET));
+ rv = write(fd, write_buf, rwbuf_size);
if (rv == -1) {
ATF_REQUIRE_MSG(errno != EPERM,
"Seal %x prevented write", except);
@@ -265,10 +285,13 @@ test_all_seals_except(int fd, int except)
strerror(errno));
}
- addr = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE,
- MAP_SHARED, fd, 0);
+ addr = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_SHARED,
+ fd, 0);
ATF_REQUIRE_MSG(addr != MAP_FAILED,
- "Mmap failed unexpectedly (%s)", strerror(errno));
+ "mmap(NULL, %llu, 0x%x, 0x%x, %d, 0) failed: %s",
+ (unsigned long long)st.st_size,
+ PROT_READ|PROT_WRITE, MAP_SHARED, fd,
+ strerror(errno));
}
if (except & ~F_SEAL_SHRINK) {
@@ -305,11 +328,13 @@ ATF_TC_BODY(seal_shrink, tc)
{
int fd;
+ setupbufs();
+
RL(fd = memfd_create("", MFD_ALLOW_SEALING));
- RL(ftruncate(fd, sizeof(write_buf)));
+ RL(ftruncate(fd, rwbuf_size));
RL(fcntl(fd, F_ADD_SEALS, F_SEAL_SHRINK));
- ATF_REQUIRE_EQ_MSG(ftruncate(fd, sizeof(write_buf)/2), -1,
+ ATF_REQUIRE_EQ_MSG(ftruncate(fd, rwbuf_size/2), -1,
"Truncate succeeded unexpectedly");
ATF_REQUIRE_ERRNO(EPERM, true);
@@ -327,11 +352,13 @@ ATF_TC_BODY(seal_grow, tc)
{
int fd;
+ setupbufs();
+
RL(fd = memfd_create("", MFD_ALLOW_SEALING));
- RL(ftruncate(fd, sizeof(write_buf)/2));
+ RL(ftruncate(fd, rwbuf_size/2));
RL(fcntl(fd, F_ADD_SEALS, F_SEAL_GROW));
- ATF_REQUIRE_EQ_MSG(ftruncate(fd, sizeof(write_buf)), -1,
+ ATF_REQUIRE_EQ_MSG(ftruncate(fd, rwbuf_size), -1,
"Truncate succeeded unexpectedly");
ATF_REQUIRE_ERRNO(EPERM, true);
@@ -349,11 +376,13 @@ ATF_TC_BODY(seal_write, tc)
{
int fd;
+ setupbufs();
+
RL(fd = memfd_create("", MFD_ALLOW_SEALING));
- RL(ftruncate(fd, sizeof(write_buf)/2));
+ RL(ftruncate(fd, rwbuf_size/2));
RL(fcntl(fd, F_ADD_SEALS, F_SEAL_WRITE));
- ATF_REQUIRE_EQ_MSG(write(fd, write_buf, sizeof(write_buf)), -1,
+ ATF_REQUIRE_EQ_MSG(write(fd, write_buf, rwbuf_size), -1,
"Write succeeded unexpectedly");
ATF_REQUIRE_ERRNO(EPERM, true);
@@ -372,12 +401,15 @@ ATF_TC_BODY(seal_write_mmap, tc)
int fd;
void *addr;
+ setupbufs();
+
RL(fd = memfd_create("", MFD_ALLOW_SEALING));
- RL(ftruncate(fd, sizeof(read_buf)));
+ RL(ftruncate(fd, rwbuf_size));
- addr = mmap(NULL, sizeof(read_buf), PROT_READ|PROT_WRITE, MAP_SHARED,
- fd, 0);
- ATF_REQUIRE_MSG(addr != MAP_FAILED, "Mmap failed unexpectedly (%s)",
+ addr = mmap(NULL, rwbuf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+ ATF_REQUIRE_MSG(addr != MAP_FAILED,
+ "mmap(NULL, %zu, 0x%x, 0x%x, %d, 0) failed: %s",
+ rwbuf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd,
strerror(errno));
ATF_REQUIRE_EQ_MSG(fcntl(fd, F_ADD_SEALS, F_SEAL_WRITE), -1,
@@ -396,11 +428,13 @@ ATF_TC_BODY(seal_future_write, tc)
{
int fd;
+ setupbufs();
+
RL(fd = memfd_create("", MFD_ALLOW_SEALING));
- RL(ftruncate(fd, sizeof(write_buf)/2));
+ RL(ftruncate(fd, rwbuf_size/2));
RL(fcntl(fd, F_ADD_SEALS, F_SEAL_FUTURE_WRITE));
- ATF_REQUIRE_EQ_MSG(write(fd, write_buf, sizeof(write_buf)), -1,
+ ATF_REQUIRE_EQ_MSG(write(fd, write_buf, rwbuf_size), -1,
"Write succeeded unexpectedly");
ATF_REQUIRE_ERRNO(EPERM, true);
@@ -420,17 +454,22 @@ ATF_TC_BODY(seal_future_write_mmap, tc)
int fd;
void *addr;
+ setupbufs();
+
RL(fd = memfd_create("", MFD_ALLOW_SEALING));
- RL(ftruncate(fd, sizeof(read_buf)));
- addr = mmap(NULL, sizeof(read_buf), PROT_READ|PROT_WRITE, MAP_SHARED,
- fd, 0);
- ATF_REQUIRE_MSG(addr != MAP_FAILED, "Mmap failed unexpectedly (%s)",
+ RL(ftruncate(fd, rwbuf_size));
+ addr = mmap(NULL, rwbuf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
+ ATF_REQUIRE_MSG(addr != MAP_FAILED,
+ "mmap(NULL, %zu, 0x%x, 0x%x, %d, 0) failed: %s",
+ rwbuf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd,
strerror(errno));
RL(fcntl(fd, F_ADD_SEALS, F_SEAL_FUTURE_WRITE));
- ATF_REQUIRE_EQ_MSG(mmap(NULL, sizeof(read_buf), PROT_READ|PROT_WRITE,
- MAP_SHARED, fd, 0), MAP_FAILED, "Mmap succeeded unexpectedly");
+ ATF_REQUIRE_EQ_MSG(mmap(NULL, rwbuf_size, PROT_READ|PROT_WRITE,
+ MAP_SHARED, fd, 0), MAP_FAILED,
+ "mmap(NULL, %zu, 0x%x, 0x%x, %d, 0) succeeded unexpectedly",
+ rwbuf_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd);
ATF_REQUIRE_ERRNO(EPERM, true);
}
diff --git a/kernel/t_rnd.c b/kernel/t_rnd.c
index afa21411947a..6fb458f1acb1 100644
--- a/kernel/t_rnd.c
+++ b/kernel/t_rnd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_rnd.c,v 1.11 2017/04/16 18:24:23 riastradh Exp $ */
+/* $NetBSD: t_rnd.c,v 1.13 2023/11/24 16:36:23 riastradh Exp $ */
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_rnd.c,v 1.11 2017/04/16 18:24:23 riastradh Exp $");
+__RCSID("$NetBSD: t_rnd.c,v 1.13 2023/11/24 16:36:23 riastradh Exp $");
#include <sys/types.h>
#include <sys/fcntl.h>
@@ -81,7 +81,7 @@ ATF_TC_BODY(RNDADDDATA2, tc)
fd = rump_sys_open("/dev/random", O_RDWR, 0);
if (fd == -1)
atf_tc_fail_errno("cannot open /dev/random");
-
+
rd.entropy = 1;
rd.len = -1;
ATF_REQUIRE_ERRNO(EINVAL, rump_sys_ioctl(fd, RNDADDDATA, &rd) == -1);
@@ -106,7 +106,7 @@ ATF_TC_BODY(read_random, tc)
alarm(2);
RL(fd = rump_sys_open("/dev/random", RUMP_O_RDONLY));
RL(rump_sys_read(fd, buf, sizeof(buf)));
- RZ(rump_sys_close(fd));
+ RL(rump_sys_close(fd));
}
}
diff --git a/kernel/t_umount.sh b/kernel/t_umount.sh
index 4784b641718d..1dc46b93b2f3 100644
--- a/kernel/t_umount.sh
+++ b/kernel/t_umount.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_umount.sh,v 1.6 2022/05/24 20:50:20 andvar Exp $
+# $NetBSD: t_umount.sh,v 1.9 2025/08/18 14:59:51 christos Exp $
#
# Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -41,6 +41,11 @@ umount_head()
}
umount_body()
{
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
+
+ mydir=$(pwd)
cat >disktab <<EOF
floppy288|2.88MB 3.5in Extra High Density Floppy:\
:ty=floppy:se#512:nt#2:rm#300:ns#36:nc#80:\
@@ -49,6 +54,12 @@ floppy288|2.88MB 3.5in Extra High Density Floppy:\
:pc#5760:oc#0:
EOF
+ cat << EOF > dot
+cd: Can't cd to ".": No such file or directory
+EOF
+ cat << EOF > dotdot
+cd: Can't cd to "..": No such file or directory
+EOF
echo "*** Creating a dummy directory tree at" \
"${TMPMP} mounted on ${TMPIM}"
@@ -65,22 +76,19 @@ EOF
test -e "${TMPMP}/in_mounted_directory" || \
atf_fail "Test file not present in mounted directory!"
- mydir="`pwd`"
cd "${TMPMP}"
atf_check -o ignore -e ignore umount -f "${BVND}${MPART}"
atf_check -s ne:0 -e inline:"ls: .: No such file or directory\n" ls .
atf_check -s ne:0 -e inline:"ls: ..: No such file or directory\n" ls ..
- atf_check -s ne:0 -e ignore -o inline:"cd: can't cd to .\n" \
- -x "cd . 2>&1"
- atf_check -s ne:0 -e ignore -o inline:"cd: can't cd to ..\n" \
- -x "cd .. 2>&1"
+ atf_check -s ne:0 -e ignore -o file:"${mydir}/dot" -x "cd . 2>&1"
+ atf_check -s ne:0 -e ignore -o file:"${mydir}/dotdot" -x "cd .. 2>&1"
cd "${mydir}"
test -e "${TMPMP}/under_the_mount" || \
- atf_fail "Original mount point disapeared!"
+ atf_fail "Original mount point disappeared!"
}
umount_cleanup()
{
diff --git a/kernel/t_umountstress.sh b/kernel/t_umountstress.sh
index fd50a1daca30..737334e588aa 100644
--- a/kernel/t_umountstress.sh
+++ b/kernel/t_umountstress.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_umountstress.sh,v 1.5 2013/05/31 14:40:48 gson Exp $
+# $NetBSD: t_umountstress.sh,v 1.6 2025/04/19 02:07:43 rin Exp $
#
# Copyright (c) 2013 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -41,6 +41,10 @@ fileop_head()
}
fileop_body()
{
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
+
cat >disktab <<EOF
floppy288|2.88MB 3.5in Extra High Density Floppy:\
:ty=floppy:se#512:nt#2:rm#300:ns#36:nc#80:\
@@ -126,6 +130,10 @@ mountlist_head()
}
mountlist_body()
{
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
+
cat >disktab <<EOF
floppy288|2.88MB 3.5in Extra High Density Floppy:\
:ty=floppy:se#512:nt#2:rm#300:ns#36:nc#80:\
diff --git a/lib/Makefile b/lib/Makefile
index a18fbd9b503a..31e000a65595 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -1,11 +1,11 @@
-# $NetBSD: Makefile,v 1.35 2022/11/21 22:01:33 christos Exp $
+# $NetBSD: Makefile,v 1.38 2025/12/28 16:50:22 thorpej Exp $
.include <bsd.own.mk>
-TESTS_SUBDIRS= csu libarchive libbluetooth libc libcrypt libcurses \
+TESTS_SUBDIRS= csu libarchive libc libcrypt libcurses \
libexecinfo libi386 libm libnvmm libobjc libposix libppath \
- libprop libpthread librefuse librt libtre libusbhid libutil \
- libossaudio lua semaphore
+ libprop libpthread librefuse librt libstdc++ libtre \
+ libutil libossaudio lua semaphore
TESTS_SUBDIR_INSTALL_ONLY= libevent
@@ -21,6 +21,10 @@ TESTS_SUBDIRS+= libdes
ATFFILE_EXTRA_TPS= liblutok
.endif
+.if (${MKBLUETOOTH} != "no")
+TESTS_SUBDIRS+= libbluetooth
+.endif
+
.if (${MKSKEY} != "no")
TESTS_SUBDIRS+= libskey
.endif
@@ -30,6 +34,10 @@ TESTS_SUBDIRS+= libsljit
TESTS_SUBDIRS+= libbpfjit
.endif
+.if (${MKUSB} != "no")
+TESTS_SUBDIRS+= libusbhid
+.endif
+
TESTSDIR= ${TESTSBASE}/lib
.include <bsd.test.mk>
diff --git a/lib/csu/Makefile b/lib/csu/Makefile
index 981af154aec8..ce19b4307e16 100644
--- a/lib/csu/Makefile
+++ b/lib/csu/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.7 2018/12/27 19:33:52 christos Exp $
+# $NetBSD: Makefile,v 1.15 2026/02/10 07:28:24 skrll Exp $
NOMAN= # defined
@@ -14,7 +14,7 @@ SUBDIR+= dso
CPPFLAGS+= ${CPPFLAGS_CHECK_STACK}
BINDIR= ${TESTSDIR}
-PROG_CXX= h_initfini1 h_initfini2 h_initfini3
+PROGS_CXX= h_initfini1 h_initfini2 h_initfini3
SRCS.h_initfini1= h_initfini1.cxx h_initfini_common.cxx \
${SRCS_CHECK_STACK}
SRCS.h_initfini2= h_initfini1.cxx h_initfini_common.cxx \
@@ -24,9 +24,36 @@ SRCS.h_initfini3= h_initfini3.cxx h_initfini_common.cxx \
${SRCS_CHECK_STACK}
LDADD.h_initfini3+= -Wl,-rpath,${TESTSDIR}
-PROGS+= h_ifunc_static h_initfini_array
+PROGS+= h_ifunc_static h_initfini_array h_preinit_array
SRCS.h_ifunc_static= h_ifunc_static.c
SRCS.h_initfini_array= h_initfini_array.c
+SRCS.h_preinit_array= h_preinit_array.c
LDSTATIC.h_ifunc_static=-static
+TESTS_SH+= t_hello
+
+PROGS+= ${"${MKPIC}" != no:?h_hello_dyn:}
+PROGS+= ${"${MKPIE}" != no:?h_hello_dynpie:}
+PROGS+= ${"${MKPIE}" != no:?h_hello_relr:}
+PROGS+= h_hello_sta
+PROGS+= ${"${MKPIE}" != no:?h_hello_stapie:}
+
+h_hello_relr: CTFMERGE=: # PR toolchain/59364: ctf tools needs update
+h_hello_relr.link: CTFMERGE=: # PR toolchain/59364: ctf tools needs update
+
+SRCS.h_hello_dyn+= h_hello.c
+SRCS.h_hello_dynpie+= h_hello.c
+SRCS.h_hello_relr+= h_hello.c
+SRCS.h_hello_sta+= h_hello.c
+SRCS.h_hello_stapie+= h_hello.c
+COPTS.h_hello.c+= ${"${MKPIE}" != no:?-fPIE:}
+LDFLAGS.h_hello_dyn= -no-pie
+LDFLAGS.h_hello_dynpie= -pie
+LDFLAGS.h_hello_relr= -pie ${LD_PACK_RELATIVE_RELOCS}
+LDFLAGS.h_hello_sta= -no-pie
+LDFLAGS.h_hello_stapie= -pie ${LD_NOPACK_RELATIVE_RELOCS}
+LDSTATIC.h_hello_relr= -static
+LDSTATIC.h_hello_sta= -static
+LDSTATIC.h_hello_stapie= -static
+
.include <bsd.test.mk>
diff --git a/lib/csu/arch/riscv/h_initfini_align.S b/lib/csu/arch/riscv/h_initfini_align.S
index b90214dcdc23..aed5f8733c2d 100644
--- a/lib/csu/arch/riscv/h_initfini_align.S
+++ b/lib/csu/arch/riscv/h_initfini_align.S
@@ -1,15 +1,15 @@
-/* $NetBSD: h_initfini_align.S,v 1.1 2023/05/07 12:41:49 skrll Exp $ */
+/* $NetBSD: h_initfini_align.S,v 1.2 2023/08/24 05:51:55 rin Exp $ */
#include <machine/asm.h>
-RCSID("$NetBSD: h_initfini_align.S,v 1.1 2023/05/07 12:41:49 skrll Exp $")
+RCSID("$NetBSD: h_initfini_align.S,v 1.2 2023/08/24 05:51:55 rin Exp $")
/*
* LINTSTUB: bool check_stack_alignment(void);
*/
ENTRY_NP(check_stack_alignment)
- andi a0, a0, 15
+ andi a0, sp, 15
seqz a0, a0
ret
END(check_stack_alignment)
diff --git a/lib/csu/h_initfini_array.c b/lib/csu/h_initfini_array.c
index f308196b6f6f..fe25ad968449 100644
--- a/lib/csu/h_initfini_array.c
+++ b/lib/csu/h_initfini_array.c
@@ -3,7 +3,7 @@ static int x = 1;
static void
foo(void)
{
- x = 0;
+ x--;
}
static void (*fp) (void) __attribute__((__section__(".init_array"), __used__)) =
diff --git a/lib/csu/t_crt0.sh b/lib/csu/t_crt0.sh
index 55eb8c55e8f0..71764866766e 100644
--- a/lib/csu/t_crt0.sh
+++ b/lib/csu/t_crt0.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_crt0.sh,v 1.5 2018/12/27 19:33:52 christos Exp $
+# $NetBSD: t_crt0.sh,v 1.6 2026/02/10 07:28:24 skrll Exp $
#
# Copyright (c) 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -105,6 +105,16 @@ initfini_array_body()
atf_check -x "$(atf_get_srcdir)/h_initfini_array"
}
+atf_test_case preinit_array
+preinit_array_head()
+{
+ atf_set "descr" "Checks support for preinit_array sections"
+}
+preinit_array_body()
+{
+ atf_check -x "$(atf_get_srcdir)/h_preinit_array"
+}
+
atf_init_test_cases()
{
atf_add_test_case initfini1
@@ -112,4 +122,5 @@ atf_init_test_cases()
atf_add_test_case initfini3
atf_add_test_case initfini4
atf_add_test_case initfini_array
+ atf_add_test_case preinit_array
}
diff --git a/lib/libarchive/Makefile b/lib/libarchive/Makefile
index 19e3da22a087..52b2a441043b 100644
--- a/lib/libarchive/Makefile
+++ b/lib/libarchive/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.6 2023/06/03 09:09:15 lukem Exp $
+# $NetBSD: Makefile,v 1.17 2026/01/30 18:34:19 christos Exp $
NOMAN=
@@ -18,27 +18,34 @@ CPPFLAGS+=-I${LIBARCHIVE}/libarchive/test -I${LIBARCHIVE}/../include
DPADD+= ${LIBARCHIVE} ${LIBEXPAT} ${LIBBZ2} ${LIBLZMA} ${LIBZ} \
${LIBCRYPTO} ${LIBPTHREAD}
-LDADD+= -larchive -lexpat -lbz2 -llzma -lz -lcrypto -lpthread
+LDADD+= -Wl,--push-state,-Bstatic,-larchive,--pop-state # uses libarchive guts
+LDADD+= -lexpat -lbz2 -llzma -lz -lcrypto -lpthread
-SRCS.h_libarchive= \
-test_main.c \
-test_utils.c \
+.include "${NETBSDSRCDIR}/external/bsd/zstd/Makefile.zstd"
+PROGDPLIBS+= ${ZSTDDPLIBS} # needed by libarchive
+
+SRCS.h_libarchive+= test_main.c test_utils.c
+
+SRCS.h_libarchive+= \
read_open_memory.c \
+test_7zip_filename_encoding.c \
test_acl_nfs4.c \
test_acl_pax.c \
test_acl_platform_nfs4.c \
test_acl_platform_posix1e.c \
test_acl_posix1e.c \
test_acl_text.c \
+test_ar_mode.c \
test_archive_api_feature.c \
test_archive_clear_error.c \
test_archive_cmdline.c \
test_archive_digest.c \
-test_archive_getdate.c \
test_archive_match_owner.c \
test_archive_match_path.c \
test_archive_match_time.c \
+test_archive_parse_date.c \
test_archive_pathmatch.c \
+test_archive_read.c \
test_archive_read_add_passphrase.c \
test_archive_read_close_twice.c \
test_archive_read_close_twice_open_fd.c \
@@ -67,18 +74,19 @@ test_bad_fd.c \
test_compat_bzip2.c \
test_compat_cpio.c \
test_compat_gtar.c \
+test_compat_gtar_large.c \
test_compat_gzip.c \
test_compat_lz4.c \
test_compat_lzip.c \
test_compat_lzma.c \
test_compat_lzop.c \
test_compat_mac.c \
-test_compat_pax_libarchive_2x.c \
test_compat_perl_archive_tar.c \
test_compat_plexus_archiver_tar.c \
test_compat_solaris_pax_sparse.c \
test_compat_solaris_tar_acl.c \
test_compat_star_acl.c \
+test_compat_tar_directory.c \
test_compat_tar_hardlink.c \
test_compat_uudecode.c \
test_compat_uudecode_large.c \
@@ -98,6 +106,7 @@ test_open_fd.c \
test_open_file.c \
test_open_filename.c \
test_pax_filename_encoding.c \
+test_pax_xattr_header.c \
test_read_data_large.c \
test_read_disk.c \
test_read_disk_directory_traversals.c \
@@ -106,17 +115,21 @@ test_read_extract.c \
test_read_file_nonexistent.c \
test_read_filter_compress.c \
test_read_filter_grzip.c \
+test_read_filter_gzip_recursive.c \
test_read_filter_lrzip.c \
test_read_filter_lzop.c \
test_read_filter_lzop_multiple_parts.c \
test_read_filter_program.c \
test_read_filter_program_signature.c \
test_read_filter_uudecode.c \
+test_read_filter_uudecode_raw.c \
test_read_format_7zip.c \
test_read_format_7zip_encryption_data.c \
test_read_format_7zip_encryption_header.c \
test_read_format_7zip_encryption_partially.c \
+test_read_format_7zip_issue2765.c \
test_read_format_7zip_malformed.c \
+test_read_format_7zip_packinfo_digests.c \
test_read_format_ar.c \
test_read_format_cab.c \
test_read_format_cab_filename.c \
@@ -140,8 +153,11 @@ test_read_format_empty.c \
test_read_format_gtar_filename.c \
test_read_format_gtar_gz.c \
test_read_format_gtar_lzma.c \
+test_read_format_gtar_redundant_L.c \
test_read_format_gtar_sparse.c \
+test_read_format_gtar_sparse_length.c \
test_read_format_gtar_sparse_skip_entry.c \
+test_read_format_huge_rpm.c \
test_read_format_iso_Z.c \
test_read_format_iso_multi_extent.c \
test_read_format_iso_xorriso.c \
@@ -157,22 +173,32 @@ test_read_format_isozisofs_bz2.c \
test_read_format_lha.c \
test_read_format_lha_bugfix_0.c \
test_read_format_lha_filename.c \
+test_read_format_lha_filename_utf16.c \
test_read_format_mtree.c \
test_read_format_mtree_crash747.c \
test_read_format_pax_bz2.c \
test_read_format_rar.c \
test_read_format_rar5.c \
+test_read_format_rar_encryption.c \
test_read_format_rar_encryption_data.c \
test_read_format_rar_encryption_header.c \
test_read_format_rar_encryption_partially.c \
+test_read_format_rar_filter.c \
test_read_format_rar_invalid1.c \
+test_read_format_rar_overflow.c \
test_read_format_raw.c \
test_read_format_tar.c \
+test_read_format_tar_V_negative_size.c \
test_read_format_tar_concatenated.c \
test_read_format_tar_empty_filename.c \
test_read_format_tar_empty_pax.c \
test_read_format_tar_empty_with_gnulabel.c \
test_read_format_tar_filename.c \
+test_read_format_tar_invalid_pax_size.c \
+test_read_format_tar_mac_metadata.c \
+test_read_format_tar_pax_g_large.c \
+test_read_format_tar_pax_large_attr.c \
+test_read_format_tar_pax_negative_time.c \
test_read_format_tbz.c \
test_read_format_tgz.c \
test_read_format_tlz.c \
@@ -181,6 +207,7 @@ test_read_format_tz.c \
test_read_format_ustar_filename.c \
test_read_format_warc.c \
test_read_format_xar.c \
+test_read_format_xar_doublelink.c \
test_read_format_zip.c \
test_read_format_zip_7075_utf8_paths.c \
test_read_format_zip_comment_stored.c \
@@ -204,13 +231,16 @@ test_read_format_zip_winzip_aes_large.c \
test_read_format_zip_with_invalid_traditional_eocd.c \
test_read_format_zip_zip64.c \
test_read_large.c \
-test_read_pax_schily_xattr.c \
+test_read_pax_empty_val_no_nl.c \
test_read_pax_truncated.c \
+test_read_pax_xattr_rht_security_selinux.c \
+test_read_pax_xattr_schily.c \
test_read_position.c \
test_read_set_format.c \
test_read_too_many_filters.c \
test_read_truncated.c \
test_read_truncated_filter.c \
+test_short_writes.c \
test_sparse_basic.c \
test_tar_filenames.c \
test_tar_large.c \
@@ -220,6 +250,7 @@ test_warn_missing_hardlink_target.c \
test_write_disk.c \
test_write_disk_appledouble.c \
test_write_disk_failures.c \
+test_write_disk_fixup.c \
test_write_disk_hardlink.c \
test_write_disk_hfs_compression.c \
test_write_disk_lookup.c \
@@ -230,6 +261,7 @@ test_write_disk_secure.c \
test_write_disk_secure744.c \
test_write_disk_secure745.c \
test_write_disk_secure746.c \
+test_write_disk_secure_noabsolutepaths.c \
test_write_disk_sparse.c \
test_write_disk_symlink.c \
test_write_disk_times.c \
@@ -268,6 +300,7 @@ test_write_format_mtree_classic.c \
test_write_format_mtree_classic_indent.c \
test_write_format_mtree_fflags.c \
test_write_format_mtree_no_separator.c \
+test_write_format_mtree_preset_digests.c \
test_write_format_mtree_quoted_filename.c \
test_write_format_pax.c \
test_write_format_raw.c \
@@ -283,315 +316,405 @@ test_write_format_warc_empty.c \
test_write_format_xar.c \
test_write_format_xar_empty.c \
test_write_format_zip.c \
+test_write_format_zip64_stream.c \
+test_write_format_zip_compression_bzip2.c \
+test_write_format_zip_compression_lzmaxz.c \
test_write_format_zip_compression_store.c \
+test_write_format_zip_compression_zstd.c \
test_write_format_zip_empty.c \
test_write_format_zip_empty_zip64.c \
+test_write_format_zip_entry_size_unset.c \
test_write_format_zip_file.c \
test_write_format_zip_file_zip64.c \
test_write_format_zip_large.c \
+test_write_format_zip_stream.c \
+test_write_format_zip_windows_path.c \
test_write_format_zip_zip64.c \
test_write_open_memory.c \
test_write_read_format_zip.c \
test_xattr_platform.c \
-test_zip_filename_encoding.c
+test_zip_filename_encoding.c
FILESDIR= ${TESTSDIR}
FILES=\
-test_acl_pax_nfs4.tar.uu \
-test_acl_pax_posix1e.tar.uu \
-test_archive_string_conversion.txt.Z.uu \
-test_compat_bzip2_1.tbz.uu \
-test_compat_bzip2_2.tbz.uu \
-test_compat_cpio_1.cpio.uu \
-test_compat_gtar_1.tar.uu \
-test_compat_gtar_2.tar.uu \
-test_compat_gzip_1.tgz.uu \
-test_compat_gzip_2.tgz.uu \
-test_compat_lz4_1.tar.lz4.uu \
-test_compat_lz4_2.tar.lz4.uu \
-test_compat_lz4_3.tar.lz4.uu \
-test_compat_lz4_B4.tar.lz4.uu \
-test_compat_lz4_B4BD.tar.lz4.uu \
-test_compat_lz4_B4BDBX.tar.lz4.uu \
-test_compat_lz4_B5.tar.lz4.uu \
-test_compat_lz4_B5BD.tar.lz4.uu \
-test_compat_lz4_B6.tar.lz4.uu \
-test_compat_lz4_B6BD.tar.lz4.uu \
-test_compat_lz4_B7.tar.lz4.uu \
-test_compat_lz4_B7BD.tar.lz4.uu \
-test_compat_lzip_1.tlz.uu \
-test_compat_lzip_2.tlz.uu \
-test_compat_lzma_1.tlz.uu \
-test_compat_lzma_2.tlz.uu \
-test_compat_lzma_3.tlz.uu \
-test_compat_lzop_1.tar.lzo.uu \
-test_compat_lzop_2.tar.lzo.uu \
-test_compat_lzop_3.tar.lzo.uu \
-test_compat_mac-1.tar.Z.uu \
-test_compat_mac-2.tar.Z.uu \
-test_compat_pax_libarchive_2x.tar.Z.uu \
-test_compat_perl_archive_tar.tar.uu \
-test_compat_plexus_archiver_tar.tar.uu \
-test_compat_solaris_pax_sparse_1.pax.Z.uu \
-test_compat_solaris_pax_sparse_2.pax.Z.uu \
-test_compat_solaris_tar_acl.tar.uu \
-test_compat_star_acl_nfs4.tar.uu \
-test_compat_star_acl_posix1e.tar.uu \
-test_compat_tar_hardlink_1.tar.uu \
-test_compat_uudecode_large.tar.Z.uu \
-test_compat_xz_1.txz.uu \
-test_compat_zip_1.zip.uu \
-test_compat_zip_2.zip.uu \
-test_compat_zip_3.zip.uu \
-test_compat_zip_4.zip.uu \
-test_compat_zip_5.zip.uu \
-test_compat_zip_6.zip.uu \
-test_compat_zip_7.xps.uu \
-test_compat_zip_8.zip.uu \
-test_compat_zstd_1.tar.zst.uu \
-test_fuzz.cab.uu \
-test_fuzz.lzh.uu \
-test_fuzz_1.iso.Z.uu \
-test_pax_filename_encoding.tar.uu \
-test_rar_multivolume_multiple_files.part1.rar.uu \
-test_rar_multivolume_multiple_files.part2.rar.uu \
-test_rar_multivolume_multiple_files.part3.rar.uu \
-test_rar_multivolume_multiple_files.part4.rar.uu \
-test_rar_multivolume_multiple_files.part5.rar.uu \
-test_rar_multivolume_multiple_files.part6.rar.uu \
-test_rar_multivolume_single_file.part1.rar.uu \
-test_rar_multivolume_single_file.part2.rar.uu \
-test_rar_multivolume_single_file.part3.rar.uu \
-test_rar_multivolume_uncompressed_files.part01.rar.uu \
-test_rar_multivolume_uncompressed_files.part02.rar.uu \
-test_rar_multivolume_uncompressed_files.part03.rar.uu \
-test_rar_multivolume_uncompressed_files.part04.rar.uu \
-test_rar_multivolume_uncompressed_files.part05.rar.uu \
-test_rar_multivolume_uncompressed_files.part06.rar.uu \
-test_rar_multivolume_uncompressed_files.part07.rar.uu \
-test_rar_multivolume_uncompressed_files.part08.rar.uu \
-test_rar_multivolume_uncompressed_files.part09.rar.uu \
-test_rar_multivolume_uncompressed_files.part10.rar.uu \
-test_read_filter_grzip.tar.grz.uu \
-test_read_filter_lrzip.tar.lrz.uu \
-test_read_filter_lzop.tar.lzo.uu \
-test_read_filter_lzop_multiple_parts.tar.lzo.uu \
-test_read_format_7zip_bcj2_bzip2.7z.uu \
-test_read_format_7zip_bcj2_copy_1.7z.uu \
-test_read_format_7zip_bcj2_copy_2.7z.uu \
-test_read_format_7zip_bcj2_copy_lzma.7z.uu \
-test_read_format_7zip_bcj2_deflate.7z.uu \
-test_read_format_7zip_bcj2_lzma1_1.7z.uu \
-test_read_format_7zip_bcj2_lzma1_2.7z.uu \
-test_read_format_7zip_bcj2_lzma2_1.7z.uu \
-test_read_format_7zip_bcj2_lzma2_2.7z.uu \
-test_read_format_7zip_bcj_bzip2.7z.uu \
-test_read_format_7zip_bcj_copy.7z.uu \
-test_read_format_7zip_bcj_deflate.7z.uu \
-test_read_format_7zip_bcj_lzma1.7z.uu \
-test_read_format_7zip_bcj_lzma2.7z.uu \
-test_read_format_7zip_bzip2.7z.uu \
-test_read_format_7zip_copy.7z.uu \
-test_read_format_7zip_copy_2.7z.uu \
-test_read_format_7zip_deflate.7z.uu \
-test_read_format_7zip_delta_lzma1.7z.uu \
-test_read_format_7zip_delta_lzma2.7z.uu \
-test_read_format_7zip_empty_archive.7z.uu \
-test_read_format_7zip_empty_file.7z.uu \
-test_read_format_7zip_encryption.7z.uu \
-test_read_format_7zip_encryption_header.7z.uu \
-test_read_format_7zip_encryption_partially.7z.uu \
-test_read_format_7zip_lzma1.7z.uu \
-test_read_format_7zip_lzma1_2.7z.uu \
-test_read_format_7zip_lzma1_lzma2.7z.uu \
-test_read_format_7zip_lzma2.7z.uu \
-test_read_format_7zip_malformed.7z.uu \
-test_read_format_7zip_malformed2.7z.uu \
-test_read_format_7zip_ppmd.7z.uu \
-test_read_format_7zip_symbolic_name.7z.uu \
-test_read_format_ar.ar.uu \
-test_read_format_cab_1.cab.uu \
-test_read_format_cab_2.cab.uu \
-test_read_format_cab_3.cab.uu \
-test_read_format_cab_filename_cp932.cab.uu \
-test_read_format_cpio_bin_be.cpio.uu \
-test_read_format_cpio_bin_le.cpio.uu \
-test_read_format_cpio_filename_cp866.cpio.uu \
-test_read_format_cpio_filename_eucjp.cpio.uu \
-test_read_format_cpio_filename_koi8r.cpio.uu \
-test_read_format_cpio_filename_utf8_jp.cpio.uu \
-test_read_format_cpio_filename_utf8_ru.cpio.uu \
-test_read_format_cpio_svr4_bzip2_rpm.rpm.uu \
-test_read_format_cpio_svr4_gzip_rpm.rpm.uu \
-test_read_format_gtar_filename_cp866.tar.Z.uu \
-test_read_format_gtar_filename_eucjp.tar.Z.uu \
-test_read_format_gtar_filename_koi8r.tar.Z.uu \
-test_read_format_gtar_sparse_1_13.tar.uu \
-test_read_format_gtar_sparse_1_17.tar.uu \
-test_read_format_gtar_sparse_1_17_posix00.tar.uu \
-test_read_format_gtar_sparse_1_17_posix01.tar.uu \
-test_read_format_gtar_sparse_1_17_posix10.tar.uu \
-test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu \
-test_read_format_gtar_sparse_skip_entry.tar.Z.uu \
-test_read_format_iso.iso.Z.uu \
-test_read_format_iso_2.iso.Z.uu \
-test_read_format_iso_joliet.iso.Z.uu \
-test_read_format_iso_joliet_by_nero.iso.Z.uu \
-test_read_format_iso_joliet_long.iso.Z.uu \
-test_read_format_iso_joliet_rockridge.iso.Z.uu \
-test_read_format_iso_multi_extent.iso.Z.uu \
-test_read_format_iso_rockridge.iso.Z.uu \
-test_read_format_iso_rockridge_ce.iso.Z.uu \
-test_read_format_iso_rockridge_new.iso.Z.uu \
-test_read_format_iso_rockridge_rr_moved.iso.Z.uu \
-test_read_format_iso_xorriso.iso.Z.uu \
-test_read_format_iso_zisofs.iso.Z.uu \
-test_read_format_lha_bugfix_0.lzh.uu \
-test_read_format_lha_filename_cp932.lzh.uu \
-test_read_format_lha_header0.lzh.uu \
-test_read_format_lha_header1.lzh.uu \
-test_read_format_lha_header2.lzh.uu \
-test_read_format_lha_header3.lzh.uu \
-test_read_format_lha_lh0.lzh.uu \
-test_read_format_lha_lh6.lzh.uu \
-test_read_format_lha_lh7.lzh.uu \
-test_read_format_lha_withjunk.lzh.uu \
-test_read_format_mtree.mtree.uu \
-test_read_format_mtree_crash747.mtree.bz2.uu \
-test_read_format_mtree_nomagic.mtree.uu \
-test_read_format_mtree_nomagic2.mtree.uu \
-test_read_format_mtree_nomagic3.mtree.uu \
-test_read_format_mtree_noprint.mtree.uu \
-test_read_format_rar.rar.uu \
-test_read_format_rar5_arm.rar.uu \
-test_read_format_rar5_blake2.rar.uu \
-test_read_format_rar5_compressed.rar.uu \
-test_read_format_rar5_distance_overflow.rar.uu \
-test_read_format_rar5_extra_field_version.rar.uu \
-test_read_format_rar5_fileattr.rar.uu \
-test_read_format_rar5_hardlink.rar.uu \
-test_read_format_rar5_invalid_dict_reference.rar.uu \
-test_read_format_rar5_leftshift1.rar.uu \
-test_read_format_rar5_leftshift2.rar.uu \
-test_read_format_rar5_multiarchive.part01.rar.uu \
-test_read_format_rar5_multiarchive.part02.rar.uu \
-test_read_format_rar5_multiarchive.part03.rar.uu \
-test_read_format_rar5_multiarchive.part04.rar.uu \
-test_read_format_rar5_multiarchive.part05.rar.uu \
-test_read_format_rar5_multiarchive.part06.rar.uu \
-test_read_format_rar5_multiarchive.part07.rar.uu \
-test_read_format_rar5_multiarchive.part08.rar.uu \
-test_read_format_rar5_multiarchive_solid.part01.rar.uu \
-test_read_format_rar5_multiarchive_solid.part02.rar.uu \
-test_read_format_rar5_multiarchive_solid.part03.rar.uu \
-test_read_format_rar5_multiarchive_solid.part04.rar.uu \
-test_read_format_rar5_multiple_files.rar.uu \
-test_read_format_rar5_multiple_files_solid.rar.uu \
-test_read_format_rar5_nonempty_dir_stream.rar.uu \
-test_read_format_rar5_owner.rar.uu \
-test_read_format_rar5_readtables_overflow.rar.uu \
-test_read_format_rar5_solid.rar.uu \
-test_read_format_rar5_stored.rar.uu \
-test_read_format_rar5_stored_manyfiles.rar.uu \
-test_read_format_rar5_symlink.rar.uu \
-test_read_format_rar5_truncated_huff.rar.uu \
-test_read_format_rar5_win32.rar.uu \
-test_read_format_rar_binary_data.rar.uu \
-test_read_format_rar_compress_best.rar.uu \
-test_read_format_rar_compress_normal.rar.uu \
-test_read_format_rar_encryption_data.rar.uu \
-test_read_format_rar_encryption_header.rar.uu \
-test_read_format_rar_encryption_partially.rar.uu \
-test_read_format_rar_invalid1.rar.uu \
-test_read_format_rar_multi_lzss_blocks.rar.uu \
-test_read_format_rar_multivolume.part0001.rar.uu \
-test_read_format_rar_multivolume.part0002.rar.uu \
-test_read_format_rar_multivolume.part0003.rar.uu \
-test_read_format_rar_multivolume.part0004.rar.uu \
-test_read_format_rar_noeof.rar.uu \
-test_read_format_rar_ppmd_lzss_conversion.rar.uu \
-test_read_format_rar_ppmd_use_after_free.rar.uu \
-test_read_format_rar_sfx.exe.uu \
-test_read_format_rar_subblock.rar.uu \
-test_read_format_rar_unicode.rar.uu \
-test_read_format_rar_windows.rar.uu \
-test_read_format_raw.bufr.uu \
-test_read_format_raw.data.Z.uu \
-test_read_format_raw.data.gz.uu \
-test_read_format_raw.data.uu \
-test_read_format_tar_concatenated.tar.uu \
-test_read_format_tar_empty_filename.tar.uu \
-test_read_format_tar_empty_pax.tar.Z.uu \
-test_read_format_tar_empty_with_gnulabel.tar.uu \
-test_read_format_tar_filename_koi8r.tar.Z.uu \
-test_read_format_ustar_filename_cp866.tar.Z.uu \
-test_read_format_ustar_filename_eucjp.tar.Z.uu \
-test_read_format_ustar_filename_koi8r.tar.Z.uu \
-test_read_format_warc.warc.uu \
-test_read_format_zip.zip.uu \
-test_read_format_zip_7075_utf8_paths.zip.uu \
-test_read_format_zip_bz2_hang.zip.uu \
-test_read_format_zip_bzip2.zipx.uu \
-test_read_format_zip_bzip2_multi.zipx.uu \
-test_read_format_zip_comment_stored_1.zip.uu \
-test_read_format_zip_comment_stored_2.zip.uu \
-test_read_format_zip_encryption_data.zip.uu \
-test_read_format_zip_encryption_header.zip.uu \
-test_read_format_zip_encryption_partially.zip.uu \
-test_read_format_zip_extra_padding.zip.uu \
-test_read_format_zip_filename_cp866.zip.uu \
-test_read_format_zip_filename_cp932.zip.uu \
-test_read_format_zip_filename_koi8r.zip.uu \
-test_read_format_zip_filename_utf8_jp.zip.uu \
-test_read_format_zip_filename_utf8_ru.zip.uu \
-test_read_format_zip_filename_utf8_ru2.zip.uu \
-test_read_format_zip_high_compression.zip.uu \
-test_read_format_zip_jar.jar.uu \
-test_read_format_zip_length_at_end.zip.uu \
-test_read_format_zip_lzma.zipx.uu \
-test_read_format_zip_lzma_alone_leak.zipx.uu \
-test_read_format_zip_lzma_multi.zipx.uu \
-test_read_format_zip_mac_metadata.zip.uu \
-test_read_format_zip_malformed1.zip.uu \
-test_read_format_zip_msdos.zip.uu \
-test_read_format_zip_nested.zip.uu \
-test_read_format_zip_nofiletype.zip.uu \
-test_read_format_zip_padded1.zip.uu \
-test_read_format_zip_padded2.zip.uu \
-test_read_format_zip_padded3.zip.uu \
-test_read_format_zip_ppmd8.zipx.uu \
-test_read_format_zip_ppmd8_crash_1.zipx.uu \
-test_read_format_zip_ppmd8_crash_2.zipx.uu \
-test_read_format_zip_ppmd8_multi.zipx.uu \
-test_read_format_zip_sfx.uu \
-test_read_format_zip_symlink.zip.uu \
-test_read_format_zip_traditional_encryption_data.zip.uu \
-test_read_format_zip_ux.zip.uu \
-test_read_format_zip_winzip_aes128.zip.uu \
-test_read_format_zip_winzip_aes256.zip.uu \
-test_read_format_zip_winzip_aes256_large.zip.uu \
-test_read_format_zip_winzip_aes256_stored.zip.uu \
-test_read_format_zip_with_invalid_traditional_eocd.zip.uu \
-test_read_format_zip_xz_multi.zipx.uu \
-test_read_format_zip_zip64a.zip.uu \
-test_read_format_zip_zip64b.zip.uu \
-test_read_large_splitted_rar_aa.uu \
-test_read_large_splitted_rar_ab.uu \
-test_read_large_splitted_rar_ac.uu \
-test_read_large_splitted_rar_ad.uu \
-test_read_large_splitted_rar_ae.uu \
-test_read_pax_schily_xattr.tar.uu \
-test_read_splitted_rar_aa.uu \
-test_read_splitted_rar_ab.uu \
-test_read_splitted_rar_ac.uu \
-test_read_splitted_rar_ad.uu \
-test_read_too_many_filters.gz.uu \
-test_splitted_rar_seek_support_aa.uu \
-test_splitted_rar_seek_support_ab.uu \
-test_splitted_rar_seek_support_ac.uu \
-test_write_disk_appledouble.cpio.gz.uu \
-test_write_disk_hfs_compression.tgz.uu \
-test_write_disk_mac_metadata.tar.gz.uu \
+test_acl_pax_nfs4.tar.uu \
+test_acl_pax_posix1e.tar.uu \
+test_archive_string_conversion.txt.Z.uu \
+test_compat_bzip2_1.tbz.uu \
+test_compat_bzip2_2.tbz.uu \
+test_compat_cpio_1.cpio.uu \
+test_compat_gtar_1.tar.uu \
+test_compat_gtar_2.tar.uu \
+test_compat_gzip_1.tgz.uu \
+test_compat_gzip_2.tgz.uu \
+test_compat_lz4_1.tar.lz4.uu \
+test_compat_lz4_2.tar.lz4.uu \
+test_compat_lz4_3.tar.lz4.uu \
+test_compat_lz4_B4.tar.lz4.uu \
+test_compat_lz4_B4BD.tar.lz4.uu \
+test_compat_lz4_B4BDBX.tar.lz4.uu \
+test_compat_lz4_B5.tar.lz4.uu \
+test_compat_lz4_B5BD.tar.lz4.uu \
+test_compat_lz4_B6.tar.lz4.uu \
+test_compat_lz4_B6BD.tar.lz4.uu \
+test_compat_lz4_B7.tar.lz4.uu \
+test_compat_lz4_B7BD.tar.lz4.uu \
+test_compat_lz4_skippable_frames_B4.tar.lz4.uu \
+test_compat_lzip_1.tlz.uu \
+test_compat_lzip_2.tlz.uu \
+test_compat_lzip_3.lz.uu \
+test_compat_lzip_4.tlz.uu \
+test_compat_lzma_1.tlz.uu \
+test_compat_lzma_2.tlz.uu \
+test_compat_lzma_3.tlz.uu \
+test_compat_lzop_1.tar.lzo.uu \
+test_compat_lzop_2.tar.lzo.uu \
+test_compat_lzop_3.tar.lzo.uu \
+test_compat_mac-1.tar.Z.uu \
+test_compat_mac-2.tar.Z.uu \
+test_compat_perl_archive_tar.tar.uu \
+test_compat_plexus_archiver_tar.tar.uu \
+test_compat_solaris_pax_sparse_1.pax.Z.uu \
+test_compat_solaris_pax_sparse_2.pax.Z.uu \
+test_compat_solaris_tar_acl.tar.uu \
+test_compat_star_acl_nfs4.tar.uu \
+test_compat_star_acl_posix1e.tar.uu \
+test_compat_tar_directory_1.tar.uu \
+test_compat_tar_hardlink_1.tar.uu \
+test_compat_uudecode_large.tar.Z.uu \
+test_compat_xz_1.txz.uu \
+test_compat_zip_1.zip.uu \
+test_compat_zip_2.zip.uu \
+test_compat_zip_3.zip.uu \
+test_compat_zip_4.zip.uu \
+test_compat_zip_5.zip.uu \
+test_compat_zip_6.zip.uu \
+test_compat_zip_7.xps.uu \
+test_compat_zip_8.zip.uu \
+test_compat_zstd_1.tar.zst.uu \
+test_compat_zstd_2.tar.zst.uu \
+test_fuzz.cab.uu \
+test_fuzz.lzh.uu \
+test_fuzz_1.iso.Z.uu \
+test_pax_filename_encoding.tar.uu \
+test_pax_xattr_header_all.tar.uu \
+test_pax_xattr_header_libarchive.tar.uu \
+test_pax_xattr_header_schily.tar.uu \
+test_rar_multivolume_multiple_files.part1.rar.uu \
+test_rar_multivolume_multiple_files.part2.rar.uu \
+test_rar_multivolume_multiple_files.part3.rar.uu \
+test_rar_multivolume_multiple_files.part4.rar.uu \
+test_rar_multivolume_multiple_files.part5.rar.uu \
+test_rar_multivolume_multiple_files.part6.rar.uu \
+test_rar_multivolume_single_file.part1.rar.uu \
+test_rar_multivolume_single_file.part2.rar.uu \
+test_rar_multivolume_single_file.part3.rar.uu \
+test_rar_multivolume_uncompressed_files.part01.rar.uu \
+test_rar_multivolume_uncompressed_files.part02.rar.uu \
+test_rar_multivolume_uncompressed_files.part03.rar.uu \
+test_rar_multivolume_uncompressed_files.part04.rar.uu \
+test_rar_multivolume_uncompressed_files.part05.rar.uu \
+test_rar_multivolume_uncompressed_files.part06.rar.uu \
+test_rar_multivolume_uncompressed_files.part07.rar.uu \
+test_rar_multivolume_uncompressed_files.part08.rar.uu \
+test_rar_multivolume_uncompressed_files.part09.rar.uu \
+test_rar_multivolume_uncompressed_files.part10.rar.uu \
+test_read_filter_grzip.tar.grz.uu \
+test_read_filter_gzip_recursive.gz.uu \
+test_read_filter_lrzip.tar.lrz.uu \
+test_read_filter_lzop.tar.lzo.uu \
+test_read_filter_lzop_multiple_parts.tar.lzo.uu \
+test_read_filter_uudecode_base64_raw.uu \
+test_read_filter_uudecode_raw.uu \
+test_read_format_7zip_bcj2_bzip2.7z.uu \
+test_read_format_7zip_bcj2_copy_1.7z.uu \
+test_read_format_7zip_bcj2_copy_2.7z.uu \
+test_read_format_7zip_bcj2_copy_lzma.7z.uu \
+test_read_format_7zip_bcj2_deflate.7z.uu \
+test_read_format_7zip_bcj2_lzma1_1.7z.uu \
+test_read_format_7zip_bcj2_lzma1_2.7z.uu \
+test_read_format_7zip_bcj2_lzma2_1.7z.uu \
+test_read_format_7zip_bcj2_lzma2_2.7z.uu \
+test_read_format_7zip_bcj_bzip2.7z.uu \
+test_read_format_7zip_bcj_copy.7z.uu \
+test_read_format_7zip_bcj_deflate.7z.uu \
+test_read_format_7zip_bcj_lzma1.7z.uu \
+test_read_format_7zip_bcj_lzma2.7z.uu \
+test_read_format_7zip_bzip2.7z.uu \
+test_read_format_7zip_copy.7z.uu \
+test_read_format_7zip_copy_2.7z.uu \
+test_read_format_7zip_deflate.7z.uu \
+test_read_format_7zip_deflate_arm64.7z.uu \
+test_read_format_7zip_deflate_powerpc.7z.uu \
+test_read_format_7zip_delta4_lzma1.7z.uu \
+test_read_format_7zip_delta4_lzma2.7z.uu \
+test_read_format_7zip_delta_lzma1.7z.uu \
+test_read_format_7zip_delta_lzma2.7z.uu \
+test_read_format_7zip_empty_archive.7z.uu \
+test_read_format_7zip_empty_file.7z.uu \
+test_read_format_7zip_encryption.7z.uu \
+test_read_format_7zip_encryption_header.7z.uu \
+test_read_format_7zip_encryption_partially.7z.uu \
+test_read_format_7zip_extract_second.7z.uu \
+test_read_format_7zip_issue2765.7z.uu \
+test_read_format_7zip_lzma1.7z.uu \
+test_read_format_7zip_lzma1_2.7z.uu \
+test_read_format_7zip_lzma1_lzma2.7z.uu \
+test_read_format_7zip_lzma2.7z.uu \
+test_read_format_7zip_lzma2_arm.7z.uu \
+test_read_format_7zip_lzma2_arm64.7z.uu \
+test_read_format_7zip_lzma2_powerpc.7z.uu \
+test_read_format_7zip_lzma2_riscv.7z.uu \
+test_read_format_7zip_lzma2_sparc.7z.uu \
+test_read_format_7zip_malformed.7z.uu \
+test_read_format_7zip_malformed2.7z.uu \
+test_read_format_7zip_packinfo_digests.7z.uu \
+test_read_format_7zip_ppmd.7z.uu \
+test_read_format_7zip_sfx_elf.elf.uu \
+test_read_format_7zip_sfx_modified_pe.exe.uu \
+test_read_format_7zip_sfx_pe.exe.uu \
+test_read_format_7zip_solid_zstd.7z.uu \
+test_read_format_7zip_symbolic_name.7z.uu \
+test_read_format_7zip_win_attrib.7z.uu \
+test_read_format_7zip_zstd.7z.uu \
+test_read_format_7zip_zstd_arm.7z.uu \
+test_read_format_7zip_zstd_bcj.7z.uu \
+test_read_format_7zip_zstd_nobcj.7z.uu \
+test_read_format_7zip_zstd_sparc.7z.uu \
+test_read_format_ar.ar.uu \
+test_read_format_cab_1.cab.uu \
+test_read_format_cab_2.cab.uu \
+test_read_format_cab_3.cab.uu \
+test_read_format_cab_filename_cp932.cab.uu \
+test_read_format_cpio_bin_be.cpio.uu \
+test_read_format_cpio_bin_le.cpio.uu \
+test_read_format_cpio_filename_cp866.cpio.uu \
+test_read_format_cpio_filename_eucjp.cpio.uu \
+test_read_format_cpio_filename_koi8r.cpio.uu \
+test_read_format_cpio_filename_utf8_jp.cpio.uu \
+test_read_format_cpio_filename_utf8_ru.cpio.uu \
+test_read_format_cpio_svr4_bzip2_rpm.rpm.uu \
+test_read_format_cpio_svr4_gzip_rpm.rpm.uu \
+test_read_format_gtar_filename_cp866.tar.Z.uu \
+test_read_format_gtar_filename_eucjp.tar.Z.uu \
+test_read_format_gtar_filename_koi8r.tar.Z.uu \
+test_read_format_gtar_redundant_L.tar.Z.uu \
+test_read_format_gtar_sparse_1_13.tar.uu \
+test_read_format_gtar_sparse_1_17.tar.uu \
+test_read_format_gtar_sparse_1_17_posix00.tar.uu \
+test_read_format_gtar_sparse_1_17_posix01.tar.uu \
+test_read_format_gtar_sparse_1_17_posix10.tar.uu \
+test_read_format_gtar_sparse_1_17_posix10_modified.tar.uu \
+test_read_format_gtar_sparse_length.tar.Z.uu \
+test_read_format_gtar_sparse_skip_entry.tar.Z.uu \
+test_read_format_huge_rpm.rpm.uu \
+test_read_format_iso.iso.Z.uu \
+test_read_format_iso_2.iso.Z.uu \
+test_read_format_iso_3.iso.Z.uu \
+test_read_format_iso_joliet.iso.Z.uu \
+test_read_format_iso_joliet_by_nero.iso.Z.uu \
+test_read_format_iso_joliet_long.iso.Z.uu \
+test_read_format_iso_joliet_rockridge.iso.Z.uu \
+test_read_format_iso_multi_extent.iso.Z.uu \
+test_read_format_iso_rockridge.iso.Z.uu \
+test_read_format_iso_rockridge_ce.iso.Z.uu \
+test_read_format_iso_rockridge_new.iso.Z.uu \
+test_read_format_iso_rockridge_rr_moved.iso.Z.uu \
+test_read_format_iso_xorriso.iso.Z.uu \
+test_read_format_iso_zisofs.iso.Z.uu \
+test_read_format_lha_bugfix_0.lzh.uu \
+test_read_format_lha_filename_cp932.lzh.uu \
+test_read_format_lha_filename_utf16.lzh.uu \
+test_read_format_lha_header0.lzh.uu \
+test_read_format_lha_header1.lzh.uu \
+test_read_format_lha_header2.lzh.uu \
+test_read_format_lha_header3.lzh.uu \
+test_read_format_lha_lh0.lzh.uu \
+test_read_format_lha_lh6.lzh.uu \
+test_read_format_lha_lh7.lzh.uu \
+test_read_format_lha_withjunk.lzh.uu \
+test_read_format_mtree.mtree.uu \
+test_read_format_mtree_crash747.mtree.bz2.uu \
+test_read_format_mtree_nomagic.mtree.uu \
+test_read_format_mtree_nomagic2.mtree.uu \
+test_read_format_mtree_nomagic3.mtree.uu \
+test_read_format_mtree_noprint.mtree.uu \
+test_read_format_rar.rar.uu \
+test_read_format_rar4_encrypted.rar.uu \
+test_read_format_rar4_encrypted_filenames.rar.uu \
+test_read_format_rar4_solid_encrypted.rar.uu \
+test_read_format_rar4_solid_encrypted_filenames.rar.uu \
+test_read_format_rar5_arm.rar.uu \
+test_read_format_rar5_arm_filter_on_window_boundary.rar.uu \
+test_read_format_rar5_bad_window_sz_in_mltarc_file.rar.uu \
+test_read_format_rar5_blake2.rar.uu \
+test_read_format_rar5_block_size_is_too_small.rar.uu \
+test_read_format_rar5_compressed.rar.uu \
+test_read_format_rar5_data_ready_pointer_leak.rar.uu \
+test_read_format_rar5_decode_number_out_of_bounds_read.rar.uu \
+test_read_format_rar5_different_solid_window_size.rar.uu \
+test_read_format_rar5_different_window_size.rar.uu \
+test_read_format_rar5_different_winsize_on_merge.rar.uu \
+test_read_format_rar5_dirdata.rar.uu \
+test_read_format_rar5_distance_overflow.rar.uu \
+test_read_format_rar5_encrypted.rar.uu \
+test_read_format_rar5_encrypted_filenames.rar.uu \
+test_read_format_rar5_extra_field_version.rar.uu \
+test_read_format_rar5_fileattr.rar.uu \
+test_read_format_rar5_hardlink.rar.uu \
+test_read_format_rar5_invalid_dict_reference.rar.uu \
+test_read_format_rar5_invalid_hash_valid_htime_exfld.rar.uu \
+test_read_format_rar5_leftshift1.rar.uu \
+test_read_format_rar5_leftshift2.rar.uu \
+test_read_format_rar5_multiarchive.part01.rar.uu \
+test_read_format_rar5_multiarchive.part02.rar.uu \
+test_read_format_rar5_multiarchive.part03.rar.uu \
+test_read_format_rar5_multiarchive.part04.rar.uu \
+test_read_format_rar5_multiarchive.part05.rar.uu \
+test_read_format_rar5_multiarchive.part06.rar.uu \
+test_read_format_rar5_multiarchive.part07.rar.uu \
+test_read_format_rar5_multiarchive.part08.rar.uu \
+test_read_format_rar5_multiarchive_solid.part01.rar.uu \
+test_read_format_rar5_multiarchive_solid.part02.rar.uu \
+test_read_format_rar5_multiarchive_solid.part03.rar.uu \
+test_read_format_rar5_multiarchive_solid.part04.rar.uu \
+test_read_format_rar5_multiple_files.rar.uu \
+test_read_format_rar5_multiple_files_solid.rar.uu \
+test_read_format_rar5_nonempty_dir_stream.rar.uu \
+test_read_format_rar5_only_crypt_exfld.rar.uu \
+test_read_format_rar5_owner.rar.uu \
+test_read_format_rar5_readtables_overflow.rar.uu \
+test_read_format_rar5_sfx.exe.uu \
+test_read_format_rar5_solid.rar.uu \
+test_read_format_rar5_solid_encrypted.rar.uu \
+test_read_format_rar5_solid_encrypted_filenames.rar.uu \
+test_read_format_rar5_stored.rar.uu \
+test_read_format_rar5_stored_manyfiles.rar.uu \
+test_read_format_rar5_symlink.rar.uu \
+test_read_format_rar5_truncated_huff.rar.uu \
+test_read_format_rar5_unicode.rar.uu \
+test_read_format_rar5_unsupported_exfld.rar.uu \
+test_read_format_rar5_win32.rar.uu \
+test_read_format_rar5_window_buf_and_size_desync.rar.uu \
+test_read_format_rar_binary_data.rar.uu \
+test_read_format_rar_compress_best.rar.uu \
+test_read_format_rar_compress_normal.rar.uu \
+test_read_format_rar_encryption_data.rar.uu \
+test_read_format_rar_encryption_header.rar.uu \
+test_read_format_rar_encryption_partially.rar.uu \
+test_read_format_rar_endarc_huge.rar.uu \
+test_read_format_rar_filter.rar.uu \
+test_read_format_rar_invalid1.rar.uu \
+test_read_format_rar_multi_lzss_blocks.rar.uu \
+test_read_format_rar_multivolume.part0001.rar.uu \
+test_read_format_rar_multivolume.part0002.rar.uu \
+test_read_format_rar_multivolume.part0003.rar.uu \
+test_read_format_rar_multivolume.part0004.rar.uu \
+test_read_format_rar_newsub_huge.rar.uu \
+test_read_format_rar_noeof.rar.uu \
+test_read_format_rar_overflow.rar.uu \
+test_read_format_rar_ppmd_lzss_conversion.rar.uu \
+test_read_format_rar_ppmd_use_after_free.rar.uu \
+test_read_format_rar_ppmd_use_after_free2.rar.uu \
+test_read_format_rar_sfx.exe.uu \
+test_read_format_rar_subblock.rar.uu \
+test_read_format_rar_symlink_huge.rar.uu \
+test_read_format_rar_unicode.rar.uu \
+test_read_format_rar_windows.rar.uu \
+test_read_format_raw.bufr.uu \
+test_read_format_raw.data.Z.uu \
+test_read_format_raw.data.gz.uu \
+test_read_format_raw.data.uu \
+test_read_format_tar_V_negative_size.tar.uu \
+test_read_format_tar_concatenated.tar.uu \
+test_read_format_tar_empty_filename.tar.uu \
+test_read_format_tar_empty_pax.tar.Z.uu \
+test_read_format_tar_empty_with_gnulabel.tar.uu \
+test_read_format_tar_filename_koi8r.tar.Z.uu \
+test_read_format_tar_invalid_pax_size.tar.uu \
+test_read_format_tar_mac_metadata_1.tar.uu \
+test_read_format_tar_pax_g_large.tar.uu \
+test_read_format_tar_pax_large_attr.tar.Z.uu \
+test_read_format_tar_pax_negative_time.tar.uu \
+test_read_format_ustar_filename_cp866.tar.Z.uu \
+test_read_format_ustar_filename_eucjp.tar.Z.uu \
+test_read_format_ustar_filename_koi8r.tar.Z.uu \
+test_read_format_warc.warc.uu \
+test_read_format_warc_incomplete.warc.uu \
+test_read_format_xar_doublelink.xar.uu \
+test_read_format_xar_duplicate_filename_node.xar.uu \
+test_read_format_zip.zip.uu \
+test_read_format_zip_7075_utf8_paths.zip.uu \
+test_read_format_zip_7z_deflate.zip.uu \
+test_read_format_zip_7z_lzma.zip.uu \
+test_read_format_zip_bz2_hang.zip.uu \
+test_read_format_zip_bzip2.zipx.uu \
+test_read_format_zip_bzip2_multi.zipx.uu \
+test_read_format_zip_comment_stored_1.zip.uu \
+test_read_format_zip_comment_stored_2.zip.uu \
+test_read_format_zip_encryption_data.zip.uu \
+test_read_format_zip_encryption_header.zip.uu \
+test_read_format_zip_encryption_partially.zip.uu \
+test_read_format_zip_extra_padding.zip.uu \
+test_read_format_zip_filename_cp866.zip.uu \
+test_read_format_zip_filename_cp932.zip.uu \
+test_read_format_zip_filename_koi8r.zip.uu \
+test_read_format_zip_filename_utf8_jp.zip.uu \
+test_read_format_zip_filename_utf8_ru.zip.uu \
+test_read_format_zip_filename_utf8_ru2.zip.uu \
+test_read_format_zip_high_compression.zip.uu \
+test_read_format_zip_jar.jar.uu \
+test_read_format_zip_length_at_end.zip.uu \
+test_read_format_zip_lzma.zipx.uu \
+test_read_format_zip_lzma_alone_leak.zipx.uu \
+test_read_format_zip_lzma_multi.zipx.uu \
+test_read_format_zip_lzma_stream_end.zipx.uu \
+test_read_format_zip_mac_metadata.zip.uu \
+test_read_format_zip_malformed1.zip.uu \
+test_read_format_zip_msdos.zip.uu \
+test_read_format_zip_nested.zip.uu \
+test_read_format_zip_nofiletype.zip.uu \
+test_read_format_zip_padded1.zip.uu \
+test_read_format_zip_padded2.zip.uu \
+test_read_format_zip_padded3.zip.uu \
+test_read_format_zip_ppmd8.zipx.uu \
+test_read_format_zip_ppmd8_crash_1.zipx.uu \
+test_read_format_zip_ppmd8_crash_2.zipx.uu \
+test_read_format_zip_ppmd8_multi.zipx.uu \
+test_read_format_zip_sfx.uu \
+test_read_format_zip_symlink.zip.uu \
+test_read_format_zip_traditional_encryption_data.zip.uu \
+test_read_format_zip_ux.zip.uu \
+test_read_format_zip_winzip_aes128.zip.uu \
+test_read_format_zip_winzip_aes256.zip.uu \
+test_read_format_zip_winzip_aes256_large.zip.uu \
+test_read_format_zip_winzip_aes256_stored.zip.uu \
+test_read_format_zip_with_invalid_traditional_eocd.zip.uu \
+test_read_format_zip_xz_multi.zipx.uu \
+test_read_format_zip_zip64a.zip.uu \
+test_read_format_zip_zip64b.zip.uu \
+test_read_format_zip_zstd.zipx.uu \
+test_read_format_zip_zstd_multi.zipx.uu \
+test_read_large_splitted_rar_aa.uu \
+test_read_large_splitted_rar_ab.uu \
+test_read_large_splitted_rar_ac.uu \
+test_read_large_splitted_rar_ad.uu \
+test_read_large_splitted_rar_ae.uu \
+test_read_pax_empty_val_no_nl.tar.uu \
+test_read_pax_xattr_rht_security_selinux.tar.uu \
+test_read_pax_xattr_schily.tar.uu \
+test_read_splitted_rar_aa.uu \
+test_read_splitted_rar_ab.uu \
+test_read_splitted_rar_ac.uu \
+test_read_splitted_rar_ad.uu \
+test_read_too_many_filters.gz.uu \
+test_splitted_rar_seek_support_aa.uu \
+test_splitted_rar_seek_support_ab.uu \
+test_splitted_rar_seek_support_ac.uu \
+test_write_disk_appledouble.cpio.gz.uu \
+test_write_disk_appledouble_zip.zip.uu \
+test_write_disk_hfs_compression.tgz.uu \
+test_write_disk_mac_metadata.tar.gz.uu \
test_write_disk_no_hfs_compression.tgz.uu
.include <bsd.test.mk>
@@ -610,4 +733,6 @@ list.h: ${SRCS.h_libarchive} Makefile
${TOOL_GREP} -v test_compat_pax_libarchive_2x > ${.TARGET}
COPTS.test_archive_string_conversion.c+= ${CC_WNO_STRINGOP_TRUNCATION}
+COPTS.test_main.c+= ${CC_WNO_STRINGOP_OVERFLOW}
+COPTS.test_write_disk_secure.c+= ${CC_WNO_STRINGOP_OVERFLOW}
diff --git a/lib/libc/atomic/t___sync_compare_and_swap.c b/lib/libc/atomic/t___sync_compare_and_swap.c
index b1b69e035ae9..67880cc30af1 100644
--- a/lib/libc/atomic/t___sync_compare_and_swap.c
+++ b/lib/libc/atomic/t___sync_compare_and_swap.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t___sync_compare_and_swap.c,v 1.1 2019/02/26 10:01:41 isaki Exp $ */
+/* $NetBSD: t___sync_compare_and_swap.c,v 1.4 2025/12/24 20:37:03 andvar Exp $ */
/*
* Copyright (C) 2019 Tetsuya Isaki. All rights reserved.
@@ -26,12 +26,21 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t___sync_compare_and_swap.c,v 1.1 2019/02/26 10:01:41 isaki Exp $");
+__RCSID("$NetBSD: t___sync_compare_and_swap.c,v 1.4 2025/12/24 20:37:03 andvar Exp $");
#include <atf-c.h>
#include <inttypes.h>
#include <machine/types.h> // for __HAVE_ATOMIC64_OPS
+#if defined __arm__ && __ARM_ARCH <= 5
+#define pr56839_xfail \
+ atf_tc_expect_fail("PR port-arm/56839:" \
+ "GCC emits wrong codes for compare_and_swap_1 builtins" \
+ " on armv5 (el & eb)")
+#else
+#define pr56839_xfail __nothing
+#endif
+
/*
* These tests don't examine the atomicity.
*/
@@ -47,7 +56,7 @@ __RCSID("$NetBSD: t___sync_compare_and_swap.c,v 1.1 2019/02/26 10:01:41 isaki Ex
#define OLDVAL (0x1122334455667788UL)
#define NEWVAL (0x8090a0b0c0d0e0f0UL)
-#define atf_sync_bool(NAME, TYPE, FMT) \
+#define atf_sync_bool(NAME, TYPE, FMT, XFAIL) \
ATF_TC(NAME); \
ATF_TC_HEAD(NAME, tc) \
{ \
@@ -61,6 +70,7 @@ ATF_TC_BODY(NAME, tc) \
TYPE expval; \
bool expres; \
bool res; \
+ XFAIL; \
/* If successful */ \
val = (TYPE)OLDVAL; \
oldval = (TYPE)OLDVAL; \
@@ -85,14 +95,68 @@ ATF_TC_BODY(NAME, tc) \
"failure case: res expects %d but %d", expres, res); \
}
-atf_sync_bool(__sync_bool_compare_and_swap_1, uint8_t, PRIx8);
-atf_sync_bool(__sync_bool_compare_and_swap_2, uint16_t, PRIx16);
-atf_sync_bool(__sync_bool_compare_and_swap_4, uint32_t, PRIx32);
+atf_sync_bool(__sync_bool_compare_and_swap_1, uint8_t, PRIx8, pr56839_xfail);
+atf_sync_bool(__sync_bool_compare_and_swap_2, uint16_t, PRIx16, __nothing);
+atf_sync_bool(__sync_bool_compare_and_swap_4, uint32_t, PRIx32, __nothing);
#ifdef __HAVE_ATOMIC64_OPS
-atf_sync_bool(__sync_bool_compare_and_swap_8, uint64_t, PRIx64);
+atf_sync_bool(__sync_bool_compare_and_swap_8, uint64_t, PRIx64, __nothing);
#endif
-#define atf_sync_val(NAME, TYPE, FMT) \
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+# define LSB 0
+# define MSB 1
+#elif _BYTE_ORDER == _BIG_ENDIAN
+# define LSB 1
+# define MSB 0
+#else
+# error Unknown byte order!
+#endif
+
+#define atf_sync_bool_subword(NAME, SUBWIDTH, SUBTYPE, TYPE, SUBFMT, FMT, XFAIL) \
+ATF_TC(NAME##_subword); \
+ATF_TC_HEAD(NAME##_subword, tc) \
+{ \
+ atf_tc_set_md_var(tc, "descr", "subword " #NAME); \
+} \
+ATF_TC_BODY(NAME##_subword, tc) \
+{ \
+ volatile union { \
+ TYPE word; \
+ SUBTYPE subword[2]; \
+ } val; \
+ XFAIL; \
+ /* If successful */ \
+ val.subword[LSB] = -1; \
+ val.subword[MSB] = 123; \
+ ATF_CHECK(NAME(&val.subword[LSB], /*old*/-1, /*new*/-2)); \
+ ATF_CHECK_EQ_MSG(val.subword[LSB], (SUBTYPE)-2, \
+ "val.subword[LSB] = 0x%" SUBFMT, val.subword[LSB]); \
+ ATF_CHECK_EQ_MSG(val.subword[MSB], 123, \
+ "val.subword[MSB] = 0x%" SUBFMT, val.subword[MSB]); \
+ ATF_CHECK_EQ_MSG(val.word, \
+ ((TYPE)123 << (SUBWIDTH)) | (TYPE)(SUBTYPE)-2, \
+ "val.word = 0x%" FMT, val.word); \
+ /* If failed */ \
+ val.subword[LSB] = -3; \
+ val.subword[MSB] = 45; \
+ ATF_CHECK(!NAME(&val.subword[LSB], /*old*/-1, /*new*/-2)); \
+ ATF_CHECK_EQ_MSG(val.subword[LSB], (SUBTYPE)-3, \
+ "val.subword[LSB] = 0x%" SUBFMT, val.subword[LSB]); \
+ ATF_CHECK_EQ_MSG(val.subword[MSB], 45, \
+ "val.subword[MSB] = 0x%" SUBFMT, val.subword[MSB]); \
+ ATF_CHECK_EQ_MSG(val.word, \
+ ((TYPE)45 << (SUBWIDTH)) | (TYPE)(SUBTYPE)-3, \
+ "val.word = 0x%" FMT, val.word); \
+}
+
+atf_sync_bool_subword(__sync_bool_compare_and_swap_1, 8, uint8_t, uint16_t,
+ PRIx8, PRIx16, pr56839_xfail);
+atf_sync_bool_subword(__sync_bool_compare_and_swap_2, 16, uint16_t, uint32_t,
+ PRIx16, PRIx32, pr56839_xfail);
+atf_sync_bool_subword(__sync_bool_compare_and_swap_4, 32, uint32_t, uint64_t,
+ PRIx32, PRIx64, __nothing);
+
+#define atf_sync_val(NAME, TYPE, FMT, XFAIL) \
ATF_TC(NAME); \
ATF_TC_HEAD(NAME, tc) \
{ \
@@ -106,6 +170,7 @@ ATF_TC_BODY(NAME, tc) \
TYPE expval; \
TYPE expres; \
TYPE res; \
+ XFAIL; \
/* If successful */ \
val = (TYPE)OLDVAL; \
oldval = (TYPE)OLDVAL; \
@@ -130,13 +195,64 @@ ATF_TC_BODY(NAME, tc) \
"failure case: res expects 0x%" FMT " but 0x%" FMT, expres, res); \
}
-atf_sync_val(__sync_val_compare_and_swap_1, uint8_t, PRIx8);
-atf_sync_val(__sync_val_compare_and_swap_2, uint16_t, PRIx16);
-atf_sync_val(__sync_val_compare_and_swap_4, uint32_t, PRIx32);
+atf_sync_val(__sync_val_compare_and_swap_1, uint8_t, PRIx8, pr56839_xfail);
+atf_sync_val(__sync_val_compare_and_swap_2, uint16_t, PRIx16, __nothing);
+atf_sync_val(__sync_val_compare_and_swap_4, uint32_t, PRIx32, __nothing);
#ifdef __HAVE_ATOMIC64_OPS
-atf_sync_val(__sync_val_compare_and_swap_8, uint64_t, PRIx64);
+atf_sync_val(__sync_val_compare_and_swap_8, uint64_t, PRIx64, __nothing);
#endif
+#define atf_sync_val_subword(NAME, SUBWIDTH, SUBTYPE, TYPE, SUBFMT, FMT, XFAIL) \
+ATF_TC(NAME##_subword); \
+ATF_TC_HEAD(NAME##_subword, tc) \
+{ \
+ atf_tc_set_md_var(tc, "descr", "subword " #NAME); \
+} \
+ATF_TC_BODY(NAME##_subword, tc) \
+{ \
+ volatile union { \
+ TYPE word; \
+ SUBTYPE subword[2]; \
+ } val; \
+ SUBTYPE rval; \
+ XFAIL; \
+ /* If successful */ \
+ val.subword[LSB] = -1; \
+ val.subword[MSB] = 123; \
+ ATF_CHECK_EQ_MSG((rval = NAME(&val.subword[LSB], \
+ /*old*/-1, /*new*/-2)), (SUBTYPE)-1, \
+ "expected 0x%" SUBFMT ", got 0x%" SUBFMT, \
+ (SUBTYPE)-1, rval); \
+ ATF_CHECK_EQ_MSG(val.subword[LSB], (SUBTYPE)-2, \
+ "val.subword[LSB] = 0x%" SUBFMT, val.subword[LSB]); \
+ ATF_CHECK_EQ_MSG(val.subword[MSB], 123, \
+ "val.subword[MSB] = 0x%" SUBFMT, val.subword[MSB]); \
+ ATF_CHECK_EQ_MSG(val.word, \
+ ((TYPE)123 << (SUBWIDTH)) | (TYPE)(SUBTYPE)-2, \
+ "val.word = 0x%" FMT, val.word); \
+ /* If failed */ \
+ val.subword[LSB] = -3; \
+ val.subword[MSB] = 45; \
+ ATF_CHECK_EQ_MSG((rval = NAME(&val.subword[LSB], \
+ /*old*/-1, /*new*/-2)), (SUBTYPE)-3, \
+ "expected 0x%" SUBFMT ", got 0x%" SUBFMT, \
+ (SUBTYPE)-3, rval); \
+ ATF_CHECK_EQ_MSG(val.subword[LSB], (SUBTYPE)-3, \
+ "val.subword[LSB] = 0x%" SUBFMT, val.subword[LSB]); \
+ ATF_CHECK_EQ_MSG(val.subword[MSB], 45, \
+ "val.subword[MSB] = 0x%" SUBFMT, val.subword[MSB]); \
+ ATF_CHECK_EQ_MSG(val.word, \
+ ((TYPE)45 << (SUBWIDTH)) | (TYPE)(SUBTYPE)-3, \
+ "val.word = 0x%" FMT, val.word); \
+}
+
+atf_sync_val_subword(__sync_val_compare_and_swap_1, 8, uint8_t, uint16_t,
+ PRIx8, PRIx16, pr56839_xfail);
+atf_sync_val_subword(__sync_val_compare_and_swap_2, 16, uint16_t, uint32_t,
+ PRIx16, PRIx32, pr56839_xfail);
+atf_sync_val_subword(__sync_val_compare_and_swap_4, 32, uint32_t, uint64_t,
+ PRIx32, PRIx64, __nothing);
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, __sync_bool_compare_and_swap_1);
@@ -146,6 +262,10 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, __sync_bool_compare_and_swap_8);
#endif
+ ATF_TP_ADD_TC(tp, __sync_bool_compare_and_swap_1_subword);
+ ATF_TP_ADD_TC(tp, __sync_bool_compare_and_swap_2_subword);
+ ATF_TP_ADD_TC(tp, __sync_bool_compare_and_swap_4_subword);
+
ATF_TP_ADD_TC(tp, __sync_val_compare_and_swap_1);
ATF_TP_ADD_TC(tp, __sync_val_compare_and_swap_2);
ATF_TP_ADD_TC(tp, __sync_val_compare_and_swap_4);
@@ -153,5 +273,9 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, __sync_val_compare_and_swap_8);
#endif
+ ATF_TP_ADD_TC(tp, __sync_val_compare_and_swap_1_subword);
+ ATF_TP_ADD_TC(tp, __sync_val_compare_and_swap_2_subword);
+ ATF_TP_ADD_TC(tp, __sync_val_compare_and_swap_4_subword);
+
return atf_no_error();
}
diff --git a/lib/libc/atomic/t___sync_lock.c b/lib/libc/atomic/t___sync_lock.c
index efad87cddfa2..c3aa5c3e8b8c 100644
--- a/lib/libc/atomic/t___sync_lock.c
+++ b/lib/libc/atomic/t___sync_lock.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t___sync_lock.c,v 1.1 2019/02/26 10:01:41 isaki Exp $ */
+/* $NetBSD: t___sync_lock.c,v 1.2 2025/04/07 01:34:43 riastradh Exp $ */
/*
* Copyright (C) 2019 Tetsuya Isaki. All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t___sync_lock.c,v 1.1 2019/02/26 10:01:41 isaki Exp $");
+__RCSID("$NetBSD: t___sync_lock.c,v 1.2 2025/04/07 01:34:43 riastradh Exp $");
#include <atf-c.h>
#include <inttypes.h>
@@ -44,8 +44,60 @@ __RCSID("$NetBSD: t___sync_lock.c,v 1.1 2019/02/26 10:01:41 isaki Exp $");
* It's better to run only when target is actually in libc.
*/
-#define OLDVAL (0x1122334455667788UL)
-#define NEWVAL (0x8090a0b0c0d0e0f0UL)
+#if defined __vax__
+/*
+ * On VAX, __sync_lock_test_and_set_* test and set the low-order bit
+ * with BBSSI, and __sync_lock_release_* clear the low-order bit with
+ * BBCCI, so the other bits are not relevant.
+ *
+ * It is possible that, by using values other than 0 and 1, we are
+ * relying on more than gcc guarantees about __sync_lock_test_and_set_*
+ * and __sync_lock_release_*. But, well, if so, we will be alerted by
+ * a failing test.
+ */
+#define INITVAL 0x1122334455667788
+#define LOCKVAL 1
+#define LOCKRET 0
+#define LOCKEDVAL 0x1122334455667789
+#define UNLOCKEDVAL 0x1122334455667788
+#elif 0 && defined __hppa__
+/*
+ * On HPPA, the native atomic r/m/w instruction, LDCW, atomically loads
+ * a word and clears it, so the obvious choice is for the unlocked
+ * state to be nonzero and the locked state to be zero.
+ *
+ * But gcc doesn't do that.
+ *
+ * Instead, it uses zero for unlocked and nonzero for locked. So for
+ * __sync_lock_test_and_set_* it issues an out-of-line call (which on
+ * NetBSD implements by atomic_swap_N), and for __sync_lock_release_*,
+ * it issues LDCW on a scratch stack location only as a barrier and
+ * then issues STW to store a zero.
+ *
+ * So we don't use this branch after all. But I'm leaving it here as a
+ * reminder to anyone who suspects something might be wrong on HPPA.
+ */
+#define INITVAL 0x1122334455667788
+#define LOCKVAL 0
+#define LOCKRET 0x1122334455667788
+#define LOCKEDVAL 0
+#define UNLOCKEDVAL 1
+#else
+/*
+ * According to GCC documentation at
+ * <https://gcc.gnu.org/onlinedocs/gcc-12.4.0/gcc/_005f_005fsync-Builtins.html>,
+ * the only guaranteed supported value for LOCKVAL is 1, and it is not
+ * guaranteed that __sync_lock_release_* stores zero. But on many
+ * architectures other values work too, and __sync_lock_release_* does
+ * just store zero, so let's test these by default; the exceptions can
+ * be listed above.
+ */
+#define INITVAL 0x1122334455667788
+#define LOCKVAL 0x8090a0b0c0d0e0f0
+#define LOCKRET 0x1122334455667788
+#define LOCKEDVAL 0x8090a0b0c0d0e0f0
+#define UNLOCKEDVAL 0
+#endif
#define atf_sync_tas(NAME, TYPE, FMT) \
ATF_TC(NAME); \
@@ -60,10 +112,10 @@ ATF_TC_BODY(NAME, tc) \
TYPE expval; \
TYPE expres; \
TYPE res; \
- val = (TYPE)OLDVAL; \
- newval = (TYPE)NEWVAL; \
- expval = (TYPE)NEWVAL; \
- expres = (TYPE)OLDVAL; \
+ val = (TYPE)INITVAL; \
+ newval = (TYPE)LOCKVAL; \
+ expval = (TYPE)LOCKEDVAL; \
+ expres = (TYPE)LOCKRET; \
res = NAME(&val, newval); \
ATF_REQUIRE_MSG(val == expval, \
"val expects 0x%" FMT " but 0x%" FMT, expval, val); \
@@ -88,8 +140,8 @@ ATF_TC_BODY(NAME, tc) \
{ \
volatile TYPE val; \
TYPE expval; \
- val = (TYPE)OLDVAL; \
- expval = (TYPE)0; \
+ val = (TYPE)LOCKEDVAL; \
+ expval = (TYPE)UNLOCKEDVAL; \
NAME(&val); \
ATF_REQUIRE_MSG(val == expval, \
"val expects 0x%" FMT " but 0x%" FMT, expval, val); \
diff --git a/lib/libc/c063/t_faccessat.c b/lib/libc/c063/t_faccessat.c
index 5e6829f7ea45..7fb638db6b62 100644
--- a/lib/libc/c063/t_faccessat.c
+++ b/lib/libc/c063/t_faccessat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_faccessat.c,v 1.3 2017/01/10 15:13:56 christos Exp $ */
+/* $NetBSD: t_faccessat.c,v 1.5 2024/07/07 14:29:48 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_faccessat.c,v 1.3 2017/01/10 15:13:56 christos Exp $");
+__RCSID("$NetBSD: t_faccessat.c,v 1.5 2024/07/07 14:29:48 christos Exp $");
#include <sys/param.h>
#include <sys/stat.h>
@@ -72,7 +72,7 @@ ATF_TC(faccessat_fdcwd);
ATF_TC_HEAD(faccessat_fdcwd, tc)
{
atf_tc_set_md_var(tc, "descr",
- "See that faccessat works with fd as AT_FDCWD");
+ "See that faccessat works with fd as AT_FDCWD");
}
ATF_TC_BODY(faccessat_fdcwd, tc)
{
@@ -90,7 +90,7 @@ ATF_TC(faccessat_fdcwderr);
ATF_TC_HEAD(faccessat_fdcwderr, tc)
{
atf_tc_set_md_var(tc, "descr",
- "See that faccessat fails with fd as AT_FDCWD and bad path");
+ "See that faccessat fails with fd as AT_FDCWD and bad path");
}
ATF_TC_BODY(faccessat_fdcwderr, tc)
{
@@ -171,6 +171,68 @@ ATF_TC_BODY(faccessat_fdlink, tc)
ATF_REQUIRE(close(dfd) == 0);
}
+ATF_TC(faccessat_abs);
+ATF_TC_HEAD(faccessat_abs, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "See that faccessat works with invalid "
+ "fd when absolute path is provided.");
+}
+ATF_TC_BODY(faccessat_abs, tc)
+{
+ int fd;
+ char cwd[MAXPATHLEN];
+ char abs_path[MAXPATHLEN * 2];
+
+ ATF_REQUIRE(mkdir(DIR, 0755) == 0);
+ ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1);
+ ATF_REQUIRE(close(fd) == 0);
+
+ ATF_REQUIRE(getcwd(cwd, MAXPATHLEN));
+ snprintf(abs_path, sizeof(abs_path), "%s/%s", cwd, FILE);
+ ATF_REQUIRE(faccessat(-1, abs_path, W_OK, 0) == 0);
+
+}
+
+ATF_TC(faccessat_abs_fddir);
+ATF_TC_HEAD(faccessat_abs_fddir, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "See that faccessat works with "
+ "fd of directory when absolute path is provided.");
+}
+ATF_TC_BODY(faccessat_abs_fddir, tc)
+{
+ int dfd;
+ char cwd[MAXPATHLEN];
+ char abs_path[MAXPATHLEN * 2];
+
+ ATF_REQUIRE(mkdir(DIR, 0755) == 0);
+ ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1);
+ ATF_REQUIRE(close(dfd) == 0);
+
+ ATF_REQUIRE(getcwd(cwd, MAXPATHLEN));
+ snprintf(abs_path, sizeof(abs_path), "%s/%s", cwd, DIR);
+ ATF_REQUIRE(faccessat(dfd, abs_path, W_OK, 0) == 0);
+
+}
+
+ATF_TC(faccessat_abs_fdcwd);
+ATF_TC_HEAD(faccessat_abs_fdcwd, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "See that faccessat works with fd "
+ "of current directory when absolute path is provided.");
+}
+ATF_TC_BODY(faccessat_abs_fdcwd, tc)
+{
+ char cwd[MAXPATHLEN];
+ char abs_path[MAXPATHLEN * 2];
+
+ ATF_REQUIRE(mkdir(DIR, 0755) == 0);
+
+ ATF_REQUIRE(getcwd(cwd, MAXPATHLEN));
+ snprintf(abs_path, sizeof(abs_path), "%s/%s", cwd, DIR);
+ ATF_REQUIRE(faccessat(AT_FDCWD, abs_path, W_OK, 0) == 0);
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -181,6 +243,9 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, faccessat_fderr2);
ATF_TP_ADD_TC(tp, faccessat_fderr3);
ATF_TP_ADD_TC(tp, faccessat_fdlink);
+ ATF_TP_ADD_TC(tp, faccessat_abs);
+ ATF_TP_ADD_TC(tp, faccessat_abs_fddir);
+ ATF_TP_ADD_TC(tp, faccessat_abs_fdcwd);
return atf_no_error();
}
diff --git a/lib/libc/c063/t_fchmodat.c b/lib/libc/c063/t_fchmodat.c
index a7bb6831b86c..4dd015542735 100644
--- a/lib/libc/c063/t_fchmodat.c
+++ b/lib/libc/c063/t_fchmodat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fchmodat.c,v 1.3 2017/01/10 15:13:56 christos Exp $ */
+/* $NetBSD: t_fchmodat.c,v 1.7 2024/07/10 20:44:06 rillig Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fchmodat.c,v 1.3 2017/01/10 15:13:56 christos Exp $");
+__RCSID("$NetBSD: t_fchmodat.c,v 1.7 2024/07/10 20:44:06 rillig Exp $");
#include <sys/param.h>
#include <sys/stat.h>
@@ -49,6 +49,11 @@ __RCSID("$NetBSD: t_fchmodat.c,v 1.3 2017/01/10 15:13:56 christos Exp $");
#define BASELINK "symlink"
#define FILEERR "dir/fchmodaterr"
+#define modecheck(a, b) \
+ ATF_REQUIRE_MSG(((a) & ALLPERMS) == (b), \
+ "Incorrect mode found %#o != expected %#o", \
+ ((a) & ALLPERMS), (b));
+
ATF_TC(fchmodat_fd);
ATF_TC_HEAD(fchmodat_fd, tc)
{
@@ -69,7 +74,7 @@ ATF_TC_BODY(fchmodat_fd, tc)
ATF_REQUIRE(close(dfd) == 0);
ATF_REQUIRE(stat(FILE, &st) == 0);
- ATF_REQUIRE(st.st_mode = 0600);
+ modecheck(st.st_mode, 0600);
}
ATF_TC(fchmodat_fdcwd);
@@ -91,7 +96,7 @@ ATF_TC_BODY(fchmodat_fdcwd, tc)
ATF_REQUIRE(fchmodat(AT_FDCWD, BASEFILE, 0600, 0) == 0);
ATF_REQUIRE(stat(BASEFILE, &st) == 0);
- ATF_REQUIRE(st.st_mode = 0600);
+ modecheck(st.st_mode, 0600);
}
ATF_TC(fchmodat_fdcwderr);
@@ -173,14 +178,14 @@ ATF_TC_BODY(fchmodat_fdlink, tc)
ATF_REQUIRE((dfdlink = open(DIR, O_RDONLY, 0)) != -1);
ATF_REQUIRE(fchmodat(dfdlink, BASELINK, 0600, 0) == -1);
- ATF_REQUIRE(errno = ENOENT);
+ ATF_REQUIRE(errno == ENOENT);
ATF_REQUIRE(fchmodat(dfdlink, BASELINK, 0600, AT_SYMLINK_NOFOLLOW) == 0);
ATF_REQUIRE(close(dfdlink) == 0);
ATF_REQUIRE(lstat(LINK, &st) == 0);
- ATF_REQUIRE(st.st_mode = 0600);
+ modecheck(st.st_mode, 0600);
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libc/c063/t_utimensat.c b/lib/libc/c063/t_utimensat.c
index 682c2df06974..182007992177 100644
--- a/lib/libc/c063/t_utimensat.c
+++ b/lib/libc/c063/t_utimensat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_utimensat.c,v 1.6 2017/01/10 15:13:56 christos Exp $ */
+/* $NetBSD: t_utimensat.c,v 1.9 2024/08/10 15:20:22 riastradh Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,11 +29,14 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_utimensat.c,v 1.6 2017/01/10 15:13:56 christos Exp $");
+__RCSID("$NetBSD: t_utimensat.c,v 1.9 2024/08/10 15:20:22 riastradh Exp $");
#include <sys/param.h>
+
#include <sys/stat.h>
+#include <sys/statvfs.h>
#include <sys/time.h>
+
#include <atf-c.h>
#include <errno.h>
#include <fcntl.h>
@@ -43,6 +46,8 @@ __RCSID("$NetBSD: t_utimensat.c,v 1.6 2017/01/10 15:13:56 christos Exp $");
#include <string.h>
#include <unistd.h>
+#include "h_macros.h"
+
#define DIR "dir"
#define FILE "dir/utimensat"
#define BASEFILE "utimensat"
@@ -50,11 +55,32 @@ __RCSID("$NetBSD: t_utimensat.c,v 1.6 2017/01/10 15:13:56 christos Exp $");
#define BASELINK "symlink"
#define FILEERR "dir/symlink"
-const struct timespec tptr[] = {
+static const struct timespec tptr[] = {
{ 0x12345678, 987654321 },
{ 0x15263748, 123456789 },
};
+static void
+checkstattime(const struct stat *st, const struct statvfs *fs)
+{
+
+ if ((fs->f_flag & ST_NOATIME) == 0) {
+ ATF_CHECK_EQ_MSG(st->st_atimespec.tv_sec, tptr[0].tv_sec,
+ "st->st_atimespec.tv_sec=%lld tptr[0].tv_sec=%lld",
+ (long long)st->st_atimespec.tv_sec,
+ (long long)tptr[0].tv_sec);
+ ATF_CHECK_EQ_MSG(st->st_atimespec.tv_nsec, tptr[0].tv_nsec,
+ "st->st_atimespec.tv_nsec=%ld tptr[0].tv_nsec=%ld",
+ (long)st->st_atimespec.tv_nsec, (long)tptr[0].tv_nsec);
+ }
+ ATF_CHECK_EQ_MSG(st->st_mtimespec.tv_sec, tptr[1].tv_sec,
+ "st->st_mtimespec.tv_sec=%lld tptr[1].tv_sec=%lld",
+ (long long)st->st_mtimespec.tv_sec, (long long)tptr[1].tv_sec);
+ ATF_CHECK_EQ_MSG(st->st_mtimespec.tv_nsec, tptr[1].tv_nsec,
+ "st->st_mtimespec.tv_nsec=%ld tptr[1].tv_nsec=%ld",
+ (long)st->st_mtimespec.tv_nsec, (long)tptr[1].tv_nsec);
+}
+
ATF_TC(utimensat_fd);
ATF_TC_HEAD(utimensat_fd, tc)
{
@@ -65,78 +91,78 @@ ATF_TC_BODY(utimensat_fd, tc)
int dfd;
int fd;
struct stat st;
+ struct statvfs fs;
- ATF_REQUIRE(mkdir(DIR, 0755) == 0);
- ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1);
- ATF_REQUIRE(close(fd) == 0);
+ RL(mkdir(DIR, 0755));
+ RL(fd = open(FILE, O_CREAT|O_RDWR, 0644));
+ RL(close(fd));
- ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1);
- ATF_REQUIRE(utimensat(dfd, BASEFILE, tptr, 0) == 0);
- ATF_REQUIRE(close(dfd) == 0);
+ RL(dfd = open(DIR, O_RDONLY, 0));
+ RL(utimensat(dfd, BASEFILE, tptr, 0));
+ RL(close(dfd));
- ATF_REQUIRE(stat(FILE, &st) == 0);
- ATF_REQUIRE(st.st_atimespec.tv_sec == tptr[0].tv_sec);
- ATF_REQUIRE(st.st_atimespec.tv_nsec == tptr[0].tv_nsec);
- ATF_REQUIRE(st.st_mtimespec.tv_sec == tptr[1].tv_sec);
- ATF_REQUIRE(st.st_mtimespec.tv_nsec == tptr[1].tv_nsec);
+ RL(stat(FILE, &st));
+ RL(statvfs(FILE, &fs));
+ checkstattime(&st, &fs);
}
ATF_TC(utimensat_fdcwd);
ATF_TC_HEAD(utimensat_fdcwd, tc)
{
- atf_tc_set_md_var(tc, "descr",
- "See that utimensat works with fd as AT_FDCWD");
+ atf_tc_set_md_var(tc, "descr",
+ "See that utimensat works with fd as AT_FDCWD");
}
ATF_TC_BODY(utimensat_fdcwd, tc)
{
int fd;
struct stat st;
+ struct statvfs fs;
- ATF_REQUIRE(mkdir(DIR, 0755) == 0);
- ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1);
- ATF_REQUIRE(close(fd) == 0);
+ RL(mkdir(DIR, 0755));
+ RL(fd = open(FILE, O_CREAT|O_RDWR, 0644));
+ RL(close(fd));
- ATF_REQUIRE(chdir(DIR) == 0);
- ATF_REQUIRE(utimensat(AT_FDCWD, BASEFILE, tptr, 0) == 0);
+ RL(chdir(DIR));
+ RL(utimensat(AT_FDCWD, BASEFILE, tptr, 0));
- ATF_REQUIRE(stat(BASEFILE, &st) == 0);
- ATF_REQUIRE(st.st_atimespec.tv_sec == tptr[0].tv_sec);
- ATF_REQUIRE(st.st_atimespec.tv_nsec == tptr[0].tv_nsec);
- ATF_REQUIRE(st.st_mtimespec.tv_sec == tptr[1].tv_sec);
- ATF_REQUIRE(st.st_mtimespec.tv_nsec == tptr[1].tv_nsec);
+ RL(stat(BASEFILE, &st));
+ RL(statvfs(BASEFILE, &fs));
+ checkstattime(&st, &fs);
}
ATF_TC(utimensat_fdcwderr);
ATF_TC_HEAD(utimensat_fdcwderr, tc)
{
- atf_tc_set_md_var(tc, "descr",
- "See that utimensat fails with fd as AT_FDCWD and bad path");
+ atf_tc_set_md_var(tc, "descr",
+ "See that utimensat fails with fd as AT_FDCWD and bad path");
}
ATF_TC_BODY(utimensat_fdcwderr, tc)
{
- ATF_REQUIRE(mkdir(DIR, 0755) == 0);
- ATF_REQUIRE(utimensat(AT_FDCWD, FILEERR, tptr, 0) == -1);
+ RL(mkdir(DIR, 0755));
+ ATF_CHECK_ERRNO(ENOENT, utimensat(AT_FDCWD, FILEERR, tptr, 0) == -1);
}
ATF_TC(utimensat_fderr1);
ATF_TC_HEAD(utimensat_fderr1, tc)
{
- atf_tc_set_md_var(tc, "descr", "See that utimensat fail with bad path");
+ atf_tc_set_md_var(tc, "descr",
+ "See that utimensat fail with bad path");
}
ATF_TC_BODY(utimensat_fderr1, tc)
{
int dfd;
- ATF_REQUIRE(mkdir(DIR, 0755) == 0);
- ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1);
- ATF_REQUIRE(utimensat(dfd, FILEERR, tptr, 0) == -1);
- ATF_REQUIRE(close(dfd) == 0);
+ RL(mkdir(DIR, 0755));
+ RL(dfd = open(DIR, O_RDONLY, 0));
+ ATF_CHECK_ERRNO(ENOENT, utimensat(dfd, FILEERR, tptr, 0) == -1);
+ RL(close(dfd));
}
ATF_TC(utimensat_fderr2);
ATF_TC_HEAD(utimensat_fderr2, tc)
{
- atf_tc_set_md_var(tc, "descr", "See that utimensat fails with bad fdat");
+ atf_tc_set_md_var(tc, "descr",
+ "See that utimensat fails with bad fdat");
}
ATF_TC_BODY(utimensat_fderr2, tc)
{
@@ -144,29 +170,30 @@ ATF_TC_BODY(utimensat_fderr2, tc)
int fd;
char cwd[MAXPATHLEN];
- ATF_REQUIRE(mkdir(DIR, 0755) == 0);
- ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1);
- ATF_REQUIRE(close(fd) == 0);
+ RL(mkdir(DIR, 0755));
+ RL(fd = open(FILE, O_CREAT|O_RDWR, 0644));
+ RL(close(fd));
- ATF_REQUIRE((dfd = open(getcwd(cwd, MAXPATHLEN), O_RDONLY, 0)) != -1);
- ATF_REQUIRE(utimensat(dfd, BASEFILE, tptr, 0) == -1);
- ATF_REQUIRE(close(dfd) == 0);
+ RL(dfd = open(getcwd(cwd, MAXPATHLEN), O_RDONLY, 0));
+ ATF_CHECK_ERRNO(ENOENT, utimensat(dfd, BASEFILE, tptr, 0) == -1);
+ RL(close(dfd));
}
ATF_TC(utimensat_fderr3);
ATF_TC_HEAD(utimensat_fderr3, tc)
{
- atf_tc_set_md_var(tc, "descr", "See that utimensat fails with fd as -1");
+ atf_tc_set_md_var(tc, "descr",
+ "See that utimensat fails with fd as -1");
}
ATF_TC_BODY(utimensat_fderr3, tc)
{
int fd;
- ATF_REQUIRE(mkdir(DIR, 0755) == 0);
- ATF_REQUIRE((fd = open(FILE, O_CREAT|O_RDWR, 0644)) != -1);
- ATF_REQUIRE(close(fd) == 0);
+ RL(mkdir(DIR, 0755));
+ RL(fd = open(FILE, O_CREAT|O_RDWR, 0644));
+ RL(close(fd));
- ATF_REQUIRE(utimensat(-1, FILE, tptr, 0) == -1);
+ ATF_CHECK_ERRNO(EBADF, utimensat(-1, FILE, tptr, 0) == -1);
}
ATF_TC(utimensat_fdlink);
@@ -178,24 +205,22 @@ ATF_TC_BODY(utimensat_fdlink, tc)
{
int dfd;
struct stat st;
+ struct statvfs fs;
- ATF_REQUIRE(mkdir(DIR, 0755) == 0);
- ATF_REQUIRE(symlink(FILE, LINK) == 0); /* NB: FILE does not exists */
+ RL(mkdir(DIR, 0755));
+ RL(symlink(FILE, LINK)); /* NB: FILE does not exists */
- ATF_REQUIRE((dfd = open(DIR, O_RDONLY, 0)) != -1);
+ RL(dfd = open(DIR, O_RDONLY, 0));
- ATF_REQUIRE(utimensat(dfd, BASELINK, tptr, 0) == -1);
- ATF_REQUIRE(errno = ENOENT);
+ ATF_CHECK_ERRNO(ENOENT, utimensat(dfd, BASELINK, tptr, 0) == -1);
- ATF_REQUIRE(utimensat(dfd, BASELINK, tptr, AT_SYMLINK_NOFOLLOW) == 0);
+ RL(utimensat(dfd, BASELINK, tptr, AT_SYMLINK_NOFOLLOW));
- ATF_REQUIRE(close(dfd) == 0);
+ RL(close(dfd));
- ATF_REQUIRE(lstat(LINK, &st) == 0);
- ATF_REQUIRE(st.st_atimespec.tv_sec == tptr[0].tv_sec);
- ATF_REQUIRE(st.st_atimespec.tv_nsec == tptr[0].tv_nsec);
- ATF_REQUIRE(st.st_mtimespec.tv_sec == tptr[1].tv_sec);
- ATF_REQUIRE(st.st_mtimespec.tv_nsec == tptr[1].tv_nsec);
+ RL(lstat(LINK, &st));
+ RL(statvfs(DIR, &fs)); /* XXX should do lstatvfs(LINK, &fs) */
+ checkstattime(&st, &fs);
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libc/gen/Makefile b/lib/libc/gen/Makefile
index e4cbe4bb3ef2..81518bebf221 100644
--- a/lib/libc/gen/Makefile
+++ b/lib/libc/gen/Makefile
@@ -1,17 +1,22 @@
-# $NetBSD: Makefile,v 1.55 2022/05/31 13:42:59 riastradh Exp $
+# $NetBSD: Makefile,v 1.62 2025/12/18 11:44:41 martin Exp $
+
+NOMAN= # defined
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/lib/libc/gen
+BINDIR= ${TESTSDIR}
TESTS_SUBDIRS+= execve
TESTS_SUBDIRS+= posix_spawn
TESTS_C+= t_alarm
+TESTS_C+= t_arc4random
TESTS_C+= t_assert
TESTS_C+= t_basedirname
TESTS_C+= t_closefrom
TESTS_C+= t_cpuset
+TESTS_C+= t_ctype
TESTS_C+= t_dir
TESTS_C+= t_floatunditf
TESTS_C+= t_fmtcheck
@@ -37,15 +42,23 @@ TESTS_C+= t_siginfo
TESTS_C+= t_sleep
TESTS_C+= t_syslog
TESTS_C+= t_time
+TESTS_C+= t_timespec_get
TESTS_C+= t_ttyname
TESTS_C+= t_vis
+PROGS+= h_ctype_abuse
+PROGS+= h_execsig
+
.if ${MKSANITIZER:Uno} != "yes" && ${MKLIBCSANITIZER:Uno} != "yes"
COPTS.t_siginfo.c+= -DENABLE_TESTS
.endif
+CPPFLAGS.t_arc4random.c+=-I${NETBSDSRCDIR}/lib/libc/include
+CPPFLAGS.t_ctype.c+= \
+ ${"${MKPIC}" == "no" || "${LDSTATIC:U}" == "-static":?-D_CTYPE_GUARD_PAGE=0:}
CPPFLAGS.t_siginfo.c+=-D__TEST_FENV
COPTS.t_fpsetround.c+=${${ACTIVE_CC} == "gcc":? -frounding-math :}
+CPPFLAGS.t_fpclassify.c+=-D__TEST_FENV
LDADD.t_siginfo+= -lm
DPADD.t_siginfo+= ${LIBM}
@@ -54,6 +67,8 @@ DPADD.t_fpclassify+= ${LIBM}
LDADD.t_fpsetround+= -lm
DPADD.t_fpsetround+= ${LIBM}
+LDADD.t_arc4random+= -lpthread
+DPADD.t_arc4random+= ${LIBPTHREAD}
LDADD.t_nice+= -lpthread
DPADD.t_nice+= ${LIBPTHREAD}
LDADD.t_syslog+= -lpthread
diff --git a/lib/libc/gen/execve/t_execve.c b/lib/libc/gen/execve/t_execve.c
index d3752cd5f948..52f6144db07f 100644
--- a/lib/libc/gen/execve/t_execve.c
+++ b/lib/libc/gen/execve/t_execve.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_execve.c,v 1.2 2015/09/12 15:21:33 christos Exp $ */
+/* $NetBSD: t_execve.c,v 1.4 2025/03/13 12:48:22 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -26,21 +26,29 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_execve.c,v 1.4 2025/03/13 12:48:22 riastradh Exp $");
+
+#include <sys/wait.h>
+
#include <atf-c.h>
#include <errno.h>
+#include <limits.h>
+#include <signal.h>
#include <stddef.h>
#include <stdio.h>
#include <unistd.h>
+#include <time.h>
-ATF_TC(t_execve_null);
+#include "h_macros.h"
+ATF_TC(t_execve_null);
ATF_TC_HEAD(t_execve_null, tc)
{
atf_tc_set_md_var(tc, "descr",
"Tests an empty execve(2) executing");
}
-
ATF_TC_BODY(t_execve_null, tc)
{
int err;
@@ -51,9 +59,54 @@ ATF_TC_BODY(t_execve_null, tc)
"wrong error returned %d instead of %d", errno, EFAULT);
}
+ATF_TC(t_execve_sig);
+ATF_TC_HEAD(t_execve_sig, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks that execve does not drop pending signals");
+}
+ATF_TC_BODY(t_execve_sig, tc)
+{
+ const char *srcdir = atf_tc_get_config_var(tc, "srcdir");
+ char h_execsig[PATH_MAX];
+ time_t start;
+
+ snprintf(h_execsig, sizeof(h_execsig), "%s/../h_execsig", srcdir);
+ REQUIRE_LIBC(signal(SIGPIPE, SIG_IGN), SIG_ERR);
+
+ for (start = time(NULL); time(NULL) - start <= 10;) {
+ int fd[2];
+ char *const argv[] = {h_execsig, NULL};
+ pid_t pid;
+ int status;
+
+ RL(pipe(fd));
+ RL(pid = vfork());
+ if (pid == 0) {
+ if (dup2(fd[0], STDIN_FILENO) == -1)
+ _exit(1);
+ (void)execve(argv[0], argv, NULL);
+ _exit(2);
+ }
+ RL(close(fd[0]));
+ RL(kill(pid, SIGTERM));
+ if (write(fd[1], (char[]){0}, 1) == -1 && errno != EPIPE)
+ atf_tc_fail("write failed: %s", strerror(errno));
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG(WIFSIGNALED(status),
+ "child exited with status 0x%x", status);
+ ATF_REQUIRE_EQ_MSG(WTERMSIG(status), SIGTERM,
+ "child exited on signal %d (%s)",
+ WTERMSIG(status), strsignal(WTERMSIG(status)));
+ RL(close(fd[1]));
+ }
+}
+
ATF_TP_ADD_TCS(tp)
{
+
ATF_TP_ADD_TC(tp, t_execve_null);
+ ATF_TP_ADD_TC(tp, t_execve_sig);
return atf_no_error();
}
diff --git a/lib/libc/gen/posix_spawn/fa_spawn_utils.c b/lib/libc/gen/posix_spawn/fa_spawn_utils.c
index e0e6f540e4d8..639e24fe84b3 100644
--- a/lib/libc/gen/posix_spawn/fa_spawn_utils.c
+++ b/lib/libc/gen/posix_spawn/fa_spawn_utils.c
@@ -1,4 +1,4 @@
-/* $NetBSD: fa_spawn_utils.c,v 1.1 2021/11/07 15:46:20 christos Exp $ */
+/* $NetBSD: fa_spawn_utils.c,v 1.2 2025/03/16 15:35:36 riastradh Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,34 +29,34 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <sys/cdefs.h>
-__RCSID("$NetBSD: fa_spawn_utils.c,v 1.1 2021/11/07 15:46:20 christos Exp $");
+__RCSID("$NetBSD: fa_spawn_utils.c,v 1.2 2025/03/16 15:35:36 riastradh Exp $");
+
+#include <sys/stat.h>
#include <atf-c.h>
-#include <stdio.h>
#include <errno.h>
+#include <stdio.h>
#include <string.h>
-#include <sys/stat.h>
#include "fa_spawn_utils.h"
+#include "h_macros.h"
off_t
-filesize(const char * restrict fname)
+filesize(const char *fname)
{
struct stat st;
- int err;
- err = stat(fname, &st);
- ATF_REQUIRE_MSG(err == 0, "Can't stat %s (%s)", fname, strerror(errno));
+ RL(stat(fname, &st));
return st.st_size;
}
void
-empty_outfile(const char * restrict fname)
+empty_outfile(const char *fname)
{
FILE *f;
- f = fopen(fname, "w");
- ATF_REQUIRE_MSG(f != NULL, "Can't open %s (%s)", fname, strerror(errno));
- fclose(f);
+ REQUIRE_LIBC(f = fopen(fname, "w"), NULL);
+ REQUIRE_LIBC(fclose(f), EOF);
}
diff --git a/lib/libc/gen/posix_spawn/fa_spawn_utils.h b/lib/libc/gen/posix_spawn/fa_spawn_utils.h
index 0c344248e50d..2c306acb9a89 100644
--- a/lib/libc/gen/posix_spawn/fa_spawn_utils.h
+++ b/lib/libc/gen/posix_spawn/fa_spawn_utils.h
@@ -1,3 +1,5 @@
+/* $NetBSD: fa_spawn_utils.h,v 1.2 2025/03/16 15:35:36 riastradh Exp $ */
+
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -27,5 +29,11 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
-off_t filesize(const char * restrict);
-void empty_outfile(const char * restrict);
+
+#ifndef FA_SPAWN_UTILS_H
+#define FA_SPAWN_UTILS_H
+
+off_t filesize(const char *);
+void empty_outfile(const char *);
+
+#endif
diff --git a/lib/libc/gen/posix_spawn/t_fileactions.c b/lib/libc/gen/posix_spawn/t_fileactions.c
index dd58c6e84e50..57e27a0ada46 100644
--- a/lib/libc/gen/posix_spawn/t_fileactions.c
+++ b/lib/libc/gen/posix_spawn/t_fileactions.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fileactions.c,v 1.7 2021/11/07 15:46:20 christos Exp $ */
+/* $NetBSD: t_fileactions.c,v 1.11 2025/07/12 16:25:29 gutteridge Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,34 +29,24 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fileactions.c,v 1.7 2021/11/07 15:46:20 christos Exp $");
-
-#include <atf-c.h>
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_fileactions.c,v 1.11 2025/07/12 16:25:29 gutteridge Exp $");
-#include <sys/wait.h>
#include <sys/stat.h>
+#include <sys/wait.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include <atf-c.h>
#include <errno.h>
#include <fcntl.h>
#include <spawn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
#include "fa_spawn_utils.h"
-
-
-ATF_TC(t_spawn_openmode);
-
-ATF_TC_HEAD(t_spawn_openmode, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "Test the proper handling of 'mode' for 'open' fileactions");
- atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
-}
+#include "h_macros.h"
#define TESTFILE "./the_input_data"
#define CHECKFILE "./the_output_data"
@@ -66,18 +56,24 @@ static void
make_testfile(const char *restrict file)
{
FILE *f;
- size_t written;
+ ssize_t written;
- f = fopen(file, "w");
- ATF_REQUIRE(f != NULL);
- written = fwrite(TESTCONTENT, 1, strlen(TESTCONTENT), f);
- fclose(f);
- ATF_REQUIRE(written == strlen(TESTCONTENT));
+ REQUIRE_LIBC(f = fopen(file, "w"), NULL);
+ RL(written = fwrite(TESTCONTENT, 1, strlen(TESTCONTENT), f));
+ REQUIRE_LIBC(fclose(f), EOF);
+ ATF_REQUIRE((size_t)written == strlen(TESTCONTENT));
}
+ATF_TC(t_spawn_openmode);
+ATF_TC_HEAD(t_spawn_openmode, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test the proper handling of 'mode' for 'open' fileactions");
+ atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
+}
ATF_TC_BODY(t_spawn_openmode, tc)
{
- int status, err;
+ int status;
pid_t pid;
size_t insize, outsize;
char * const args[2] = { __UNCONST("cat"), NULL };
@@ -87,27 +83,28 @@ ATF_TC_BODY(t_spawn_openmode, tc)
* try a "cat < testfile > checkfile"
*/
make_testfile(TESTFILE);
- unlink(CHECKFILE);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- TESTFILE, O_RDONLY, 0);
- posix_spawn_file_actions_addopen(&fa, fileno(stdout),
- CHECKFILE, O_WRONLY|O_CREAT, 0600);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ TESTFILE, O_RDONLY, 0));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdout),
+ CHECKFILE, O_WRONLY|O_CREAT, 0600));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
/* now check that input and output have the same size */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(insize == outsize);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(insize == outsize,
+ "insize=%zu outsize=%zu", insize, outsize);
/*
* try a "cat < testfile >> checkfile"
@@ -115,25 +112,27 @@ ATF_TC_BODY(t_spawn_openmode, tc)
make_testfile(TESTFILE);
make_testfile(CHECKFILE);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- TESTFILE, O_RDONLY, 0);
- posix_spawn_file_actions_addopen(&fa, fileno(stdout),
- CHECKFILE, O_WRONLY|O_APPEND, 0);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ TESTFILE, O_RDONLY, 0));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdout),
+ CHECKFILE, O_WRONLY|O_APPEND, 0));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
/* now check that output is twice as long as input */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(insize*2 == outsize);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(insize*2 == outsize,
+ "insize*2=%zu outsize=%zu", insize*2, outsize);
/*
* try a "cat < testfile > checkfile" with input and output swapped
@@ -141,39 +140,39 @@ ATF_TC_BODY(t_spawn_openmode, tc)
make_testfile(TESTFILE);
empty_outfile(CHECKFILE);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdout),
- TESTFILE, O_RDONLY, 0);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- CHECKFILE, O_WRONLY, 0);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
-
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdout),
+ TESTFILE, O_RDONLY, 0));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ CHECKFILE, O_WRONLY, 0));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_FAILURE);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_FAILURE),
+ "status=0x%x", status);
/* now check that input and output are still the same size */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(outsize == 0);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(outsize == 0,
+ "outsize=%zu", outsize);
}
ATF_TC(t_spawn_reopen);
-
ATF_TC_HEAD(t_spawn_reopen, tc)
{
atf_tc_set_md_var(tc, "descr",
"an open filehandle can be replaced by a 'open' fileaction");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_reopen, tc)
{
- int status, err;
+ int status;
pid_t pid;
char * const args[2] = { __UNCONST("cat"), NULL };
posix_spawn_file_actions_t fa;
@@ -181,31 +180,29 @@ ATF_TC_BODY(t_spawn_reopen, tc)
/*
* make sure stdin is open in the parent
*/
- freopen("/dev/zero", "r", stdin);
+ REQUIRE_LIBC(freopen("/dev/zero", "r", stdin), NULL);
/*
* now request an open for this fd again in the child
*/
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, fileno(stdin),
- "/dev/null", O_RDONLY, 0);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, fileno(stdin),
+ "/dev/null", O_RDONLY, 0));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
- ATF_REQUIRE(err == 0);
-
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
}
ATF_TC(t_spawn_open_nonexistent);
-
ATF_TC_HEAD(t_spawn_open_nonexistent, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn fails when a file to open does not exist");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_open_nonexistent, tc)
{
int err, status;
@@ -213,9 +210,9 @@ ATF_TC_BODY(t_spawn_open_nonexistent, tc)
char * const args[2] = { __UNCONST("cat"), NULL };
posix_spawn_file_actions_t fa;
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
- "./non/ex/ist/ent", O_RDONLY, 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
+ "./non/ex/ist/ent", O_RDONLY, 0));
err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
if (err == 0) {
/*
@@ -229,13 +226,13 @@ ATF_TC_BODY(t_spawn_open_nonexistent, tc)
* The error has been noticed early enough, no child has
* been run
*/
- ATF_REQUIRE(err == ENOENT);
+ ATF_REQUIRE_MSG(err == ENOENT, "err=%d (%s)",
+ err, strerror(err));
}
- posix_spawn_file_actions_destroy(&fa);
+ RZ(posix_spawn_file_actions_destroy(&fa));
}
ATF_TC(t_spawn_open_nonexistent_diag);
-
ATF_TC_HEAD(t_spawn_open_nonexistent_diag, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -243,7 +240,6 @@ ATF_TC_HEAD(t_spawn_open_nonexistent_diag, tc)
"and delivers proper diagnostic");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_open_nonexistent_diag, tc)
{
int err;
@@ -252,7 +248,7 @@ ATF_TC_BODY(t_spawn_open_nonexistent_diag, tc)
posix_spawnattr_t attr;
posix_spawn_file_actions_t fa;
- posix_spawnattr_init(&attr);
+ RZ(posix_spawnattr_init(&attr));
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
* will cause a "proper" return value from posix_spawn(2)
@@ -260,72 +256,157 @@ ATF_TC_BODY(t_spawn_open_nonexistent_diag, tc)
* status from the child process (c.f. the non-diag variant
* of this test).
*/
- posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR);
- posix_spawn_file_actions_init(&fa);
- posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
- "./non/ex/ist/ent", O_RDONLY, 0);
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR));
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addopen(&fa, STDIN_FILENO,
+ "./non/ex/ist/ent", O_RDONLY, 0));
err = posix_spawn(&pid, "/bin/cat", &fa, &attr, args, NULL);
- ATF_REQUIRE(err == ENOENT);
- posix_spawn_file_actions_destroy(&fa);
- posix_spawnattr_destroy(&attr);
+ ATF_REQUIRE_MSG(err == ENOENT, "err=%d (%s)", err, strerror(err));
+ RZ(posix_spawn_file_actions_destroy(&fa));
+ RZ(posix_spawnattr_destroy(&attr));
}
ATF_TC(t_spawn_fileactions);
-
ATF_TC_HEAD(t_spawn_fileactions, tc)
{
atf_tc_set_md_var(tc, "descr",
"Tests various complex fileactions");
}
-
ATF_TC_BODY(t_spawn_fileactions, tc)
{
- int fd1, fd2, fd3, status, err;
+ int fd1, fd2, fd3, status;
pid_t pid;
char * const args[2] = { __UNCONST("h_fileactions"), NULL };
char helper[FILENAME_MAX];
posix_spawn_file_actions_t fa;
- posix_spawn_file_actions_init(&fa);
+ RZ(posix_spawn_file_actions_init(&fa));
- closefrom(fileno(stderr)+1);
+ RL(closefrom(fileno(stderr) + 1));
- fd1 = open("/dev/null", O_RDONLY);
+ RL(fd1 = open("/dev/null", O_RDONLY));
ATF_REQUIRE(fd1 == 3);
- fd2 = open("/dev/null", O_WRONLY, O_CLOEXEC);
+ RL(fd2 = open("/dev/null", O_WRONLY, O_CLOEXEC));
ATF_REQUIRE(fd2 == 4);
- fd3 = open("/dev/null", O_WRONLY);
+ RL(fd3 = open("/dev/null", O_WRONLY));
ATF_REQUIRE(fd3 == 5);
- posix_spawn_file_actions_addclose(&fa, fd1);
- posix_spawn_file_actions_addopen(&fa, 6, "/dev/null", O_RDWR, 0);
- posix_spawn_file_actions_adddup2(&fa, 1, 7);
+ RZ(posix_spawn_file_actions_addclose(&fa, fd1));
+ RZ(posix_spawn_file_actions_addopen(&fa, 6, "/dev/null", O_RDWR, 0));
+ RZ(posix_spawn_file_actions_adddup2(&fa, 1, 7));
snprintf(helper, sizeof helper, "%s/h_fileactions",
atf_tc_get_config_var(tc, "srcdir"));
- err = posix_spawn(&pid, helper, &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
+ RZ(posix_spawn(&pid, helper, &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
- ATF_REQUIRE(err == 0);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
+}
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ATF_TC(t_spawn_close_already_closed);
+ATF_TC_HEAD(t_spawn_close_already_closed, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "file actions closing closed descriptors are allowed (PR 59523)");
+ atf_tc_set_md_var(tc, "require.progs", "/bin/ls");
}
-ATF_TC(t_spawn_empty_fileactions);
+ATF_TC_BODY(t_spawn_close_already_closed, tc)
+{
+ int status, fd;
+ pid_t pid;
+ char * const args[2] = { __UNCONST("ls"), NULL };
+ posix_spawn_file_actions_t fa;
+
+ /* get a free file descriptor number */
+ fd = open("/dev/null", O_RDONLY);
+ ATF_REQUIRE(fd >= 0);
+ close(fd);
+ RZ(posix_spawn_file_actions_init(&fa));
+ // known closed fd
+ RZ(posix_spawn_file_actions_addclose(&fa, fd));
+ // a random fd we know nothing about (cross fingers!)
+ RZ(posix_spawn_file_actions_addclose(&fa, fd+1));
+ // high fd probably not ever been allocated, likely to trigger
+ // a fd_getfile() failure in the kernel, which is another
+ // path that originally caused the fallout in PR 59523
+ RZ(posix_spawn_file_actions_addclose(&fa, 560));
+ // redirect output to /dev/null to not garble atf test results
+ RZ(posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO, "/dev/null",
+ O_WRONLY, 0));
+ RZ(posix_spawn(&pid, "/bin/ls", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
+
+ /* ok, wait for the child to finish */
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
+}
+
+ATF_TC(t_spawn_close_already_closed_wait);
+ATF_TC_HEAD(t_spawn_close_already_closed_wait, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "file actions closing closed descriptors are allowed, "
+ "with parent process waiting (PR 59523)");
+ atf_tc_set_md_var(tc, "require.progs", "/bin/ls");
+}
+
+ATF_TC_BODY(t_spawn_close_already_closed_wait, tc)
+{
+ int status, fd;
+ pid_t pid;
+ char * const args[2] = { __UNCONST("ls"), NULL };
+ posix_spawn_file_actions_t fa;
+ posix_spawnattr_t attr;
+
+ /* get a free file descriptor number */
+ fd = open("/dev/null", O_RDONLY);
+ ATF_REQUIRE(fd >= 0);
+ close(fd);
+ RZ(posix_spawn_file_actions_init(&fa));
+ // known closed fd
+ RZ(posix_spawn_file_actions_addclose(&fa, fd));
+ // a random fd we know nothing about (cross fingers!)
+ RZ(posix_spawn_file_actions_addclose(&fa, fd+1));
+ // high fd probably not ever been allocated, likely to trigger
+ // a fd_getfile() failure in the kernel, which is another
+ // path that originally caused the fallout in PR 59523
+ RZ(posix_spawn_file_actions_addclose(&fa, 560));
+ // redirect output to /dev/null to not garble atf test results
+ RZ(posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO, "/dev/null",
+ O_WRONLY, 0));
+
+ RZ(posix_spawnattr_init(&attr));
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETPGROUP));
+
+ RZ(posix_spawn(&pid, "/bin/ls", &fa, &attr, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
+
+ /* ok, wait for the child to finish */
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
+}
+
+ATF_TC(t_spawn_empty_fileactions);
ATF_TC_HEAD(t_spawn_empty_fileactions, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn with empty fileactions (PR kern/46038)");
atf_tc_set_md_var(tc, "require.progs", "/bin/cat");
}
-
ATF_TC_BODY(t_spawn_empty_fileactions, tc)
{
- int status, err;
+ int status;
pid_t pid;
char * const args[2] = { __UNCONST("cat"), NULL };
posix_spawn_file_actions_t fa;
@@ -336,36 +417,40 @@ ATF_TC_BODY(t_spawn_empty_fileactions, tc)
* already in the parent and pass empty file actions to the child.
*/
make_testfile(TESTFILE);
- unlink(CHECKFILE);
-
- freopen(TESTFILE, "r", stdin);
- freopen(CHECKFILE, "w", stdout);
- posix_spawn_file_actions_init(&fa);
- err = posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL);
- posix_spawn_file_actions_destroy(&fa);
+ REQUIRE_LIBC(freopen(TESTFILE, "r", stdin), NULL);
+ REQUIRE_LIBC(freopen(CHECKFILE, "w", stdout), NULL);
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn(&pid, "/bin/cat", &fa, NULL, args, NULL));
+ RZ(posix_spawn_file_actions_destroy(&fa));
/* ok, wait for the child to finish */
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "status=0x%x", status);
/* now check that input and output have the same size */
insize = filesize(TESTFILE);
outsize = filesize(CHECKFILE);
- ATF_REQUIRE(insize == strlen(TESTCONTENT));
- ATF_REQUIRE(insize == outsize);
+ ATF_CHECK_MSG(insize == strlen(TESTCONTENT),
+ "insize=%zu strlen(TESTCONTENT)=%zu", insize, strlen(TESTCONTENT));
+ ATF_CHECK_MSG(insize == outsize,
+ "insize=%zu outsize=%zu", insize, outsize);
}
ATF_TP_ADD_TCS(tp)
{
+
ATF_TP_ADD_TC(tp, t_spawn_fileactions);
ATF_TP_ADD_TC(tp, t_spawn_open_nonexistent);
ATF_TP_ADD_TC(tp, t_spawn_open_nonexistent_diag);
ATF_TP_ADD_TC(tp, t_spawn_reopen);
ATF_TP_ADD_TC(tp, t_spawn_openmode);
ATF_TP_ADD_TC(tp, t_spawn_empty_fileactions);
+ ATF_TP_ADD_TC(tp, t_spawn_close_already_closed);
+ ATF_TP_ADD_TC(tp, t_spawn_close_already_closed_wait);
return atf_no_error();
}
diff --git a/lib/libc/gen/posix_spawn/t_spawn.c b/lib/libc/gen/posix_spawn/t_spawn.c
index 74588aec2697..fb438ba58c57 100644
--- a/lib/libc/gen/posix_spawn/t_spawn.c
+++ b/lib/libc/gen/posix_spawn/t_spawn.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_spawn.c,v 1.8 2022/05/31 11:22:34 andvar Exp $ */
+/* $NetBSD: t_spawn.c,v 1.12 2025/03/16 15:35:36 riastradh Exp $ */
/*-
* Copyright (c) 2012, 2021 The NetBSD Foundation, Inc.
@@ -29,72 +29,66 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_spawn.c,v 1.8 2022/05/31 11:22:34 andvar Exp $");
-#include <atf-c.h>
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_spawn.c,v 1.12 2025/03/16 15:35:36 riastradh Exp $");
#include <sys/fcntl.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/stat.h>
+#include <atf-c.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
#include <spawn.h>
-#include <string.h>
#include <stdio.h>
#include <stdlib.h>
-#include <errno.h>
-#include <stdarg.h>
-#include <fcntl.h>
+#include <string.h>
+#include <time.h>
#include <unistd.h>
#include "fa_spawn_utils.h"
+#include "h_macros.h"
-
-static void check_success(const char *, int, ...);
+static void check_success(const char *, const char *);
ATF_TC(t_spawn_ls);
-
ATF_TC_HEAD(t_spawn_ls, tc)
{
atf_tc_set_md_var(tc, "descr",
"Tests a simple posix_spawn executing /bin/ls");
}
-
ATF_TC_BODY(t_spawn_ls, tc)
{
char * const args[] = { __UNCONST("ls"), __UNCONST("-la"), NULL };
- int err;
- err = posix_spawn(NULL, "/bin/ls", NULL, NULL, args, NULL);
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawn(NULL, "/bin/ls", NULL, NULL, args, NULL));
}
ATF_TC(t_spawnp_ls);
-
ATF_TC_HEAD(t_spawnp_ls, tc)
{
atf_tc_set_md_var(tc, "descr",
"Tests a simple posix_spawnp executing ls via $PATH");
}
-
ATF_TC_BODY(t_spawnp_ls, tc)
{
char * const args[] = { __UNCONST("ls"), __UNCONST("-la"), NULL };
- int err;
- err = posix_spawnp(NULL, "ls", NULL, NULL, args, NULL);
- ATF_REQUIRE(err == 0);
+ RZ(posix_spawnp(NULL, "ls", NULL, NULL, args, NULL));
}
static void
spawn_error(const atf_tc_t *tc, const char *name, int error)
{
- char buf[FILENAME_MAX];
+ char buf[PATH_MAX];
char * const args[] = { __UNCONST(name), NULL };
int err;
- snprintf(buf, sizeof buf, "%s/%s",
+ snprintf(buf, sizeof(buf), "%s/%s",
atf_tc_get_config_var(tc, "srcdir"), name);
err = posix_spawn(NULL, buf, NULL, NULL, args, NULL);
ATF_REQUIRE_MSG(err == error, "expected error %d, "
@@ -102,46 +96,39 @@ spawn_error(const atf_tc_t *tc, const char *name, int error)
}
ATF_TC(t_spawn_zero);
-
ATF_TC_HEAD(t_spawn_zero, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn an invalid binary");
}
-
ATF_TC_BODY(t_spawn_zero, tc)
{
spawn_error(tc, "h_zero", ENOEXEC);
}
ATF_TC(t_spawn_missing);
-
ATF_TC_HEAD(t_spawn_missing, tc)
{
atf_tc_set_md_var(tc, "descr",
- "posix_spawn a non existant binary");
+ "posix_spawn a nonexistent binary");
}
-
ATF_TC_BODY(t_spawn_missing, tc)
{
spawn_error(tc, "h_nonexist", ENOENT);
}
ATF_TC(t_spawn_nonexec);
-
ATF_TC_HEAD(t_spawn_nonexec, tc)
{
atf_tc_set_md_var(tc, "descr",
"posix_spawn a script with non existing interpreter");
}
-
ATF_TC_BODY(t_spawn_nonexec, tc)
{
spawn_error(tc, "h_nonexec", ENOENT);
}
ATF_TC(t_spawn_child);
-
ATF_TC_HEAD(t_spawn_child, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -150,92 +137,75 @@ ATF_TC_HEAD(t_spawn_child, tc)
ATF_TC_BODY(t_spawn_child, tc)
{
- char buf[FILENAME_MAX];
+ char buf[PATH_MAX];
char rv[2] = { '0', '\0' };
char * const args0[] = { __UNCONST("h_spawn"), rv, NULL };
int rets[] = { 0, 1, 7 };
- int err, status;
+ int status;
pid_t pid;
- snprintf(buf, sizeof buf, "%s/h_spawn",
+ snprintf(buf, sizeof(buf), "%s/h_spawn",
atf_tc_get_config_var(tc, "srcdir"));
for (size_t i = 0; i < __arraycount(rets); i++) {
rv[0] = rets[i] + '0';
- err = posix_spawn(&pid, buf, NULL, NULL, args0, NULL);
- ATF_REQUIRE(err == 0);
- ATF_REQUIRE(pid > 0);
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) &&
- WEXITSTATUS(status) == rets[i]);
+ RZ(posix_spawn(&pid, buf, NULL, NULL, args0, NULL));
+ ATF_REQUIRE_MSG(pid > 0, "pid=%lld", (long long)pid);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == rets[i]),
+ "status=0x%x", status);
}
}
-#define CHDIRPATH "/tmp"
#define FILENAME "output"
-#define FILEPATH "/tmp/output"
-#define CHDIR 1
-#define FCHDIR 2
+enum chdirop {
+ OP_CHDIR = 1,
+ OP_FCHDIR = 2,
+};
static void
-check_success(const char *file, int argc, ...)
+check_success(const char *dir, const char *file)
{
- va_list ap;
- ssize_t bytesRead;
+ ssize_t bytes_read;
int fd;
- size_t sizeOfFile = (size_t)filesize(file);
- size_t sizeOfStr;
+ size_t sizeof_file = (size_t)filesize(file);
+ size_t sizeof_str;
char *contents;
- const char *dir;
- contents = malloc(sizeOfFile);
- ATF_REQUIRE(contents != NULL);
+ REQUIRE_LIBC(contents = malloc(sizeof_file), NULL);
- /*
- * for now only 1 variadic argument expected
- * only from t_spawn_[f]chdir_rel
- */
- if (argc != 0) {
- va_start(ap, argc);
- dir = va_arg(ap, char *);
- ATF_REQUIRE(dir != NULL);
- va_end(ap);
- } else
- dir = CHDIRPATH;
-
- fd = open(file, O_RDONLY);
- ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", file,
- strerror(errno));
+ RL(fd = open(file, O_RDONLY));
/*
* file contains form feed i.e ASCII - 10 at the end.
- * Therefore sizeOfFile - 1
+ * Therefore sizeof_file - 1
*/
- sizeOfStr = strlen(dir);
- ATF_CHECK_MSG(sizeOfStr == sizeOfFile - 1, "%zu (%s) != %zu (%s)",
- sizeOfStr, dir, sizeOfFile - 1, file);
+ sizeof_str = strlen(dir);
+ ATF_CHECK_MSG(sizeof_str == sizeof_file - 1, "%zu (%s) != %zu (%s)",
+ sizeof_str, dir, sizeof_file - 1, file);
- bytesRead = read(fd, contents, sizeOfFile - 1);
- contents[sizeOfFile - 1] = '\0';
+ bytes_read = read(fd, contents, sizeof_file - 1);
+ contents[sizeof_file - 1] = '\0';
ATF_REQUIRE_MSG(strcmp(dir, contents) == 0,
- "[%s] != [%s] Directories dont match", dir, contents);
+ "[%s] != [%s] Directories don't match", dir, contents);
- fd = close(fd);
- ATF_REQUIRE(fd == 0);
+ RL(close(fd));
- unlink(file);
+ RL(unlink(file));
free(contents);
/* XXX not really required */
- ATF_REQUIRE((size_t)bytesRead == sizeOfStr);
+ ATF_REQUIRE_MSG((size_t)bytes_read == sizeof_str,
+ "bytes_read=%zu sizeof_str=%zu", bytes_read, sizeof_str);
}
static void
-spawn_chdir(const char *dirpath, const char *filepath, int operation,
+spawn_chdir(const char *dirpath, const char *filepath, enum chdirop operation,
int expected_error)
{
- int error, fd=-1, status;
+ int error, fd = -1, status;
char * const args[2] = { __UNCONST("pwd"), NULL };
pid_t pid;
posix_spawnattr_t attr, *attr_p;
@@ -244,35 +214,29 @@ spawn_chdir(const char *dirpath, const char *filepath, int operation,
if (filepath)
empty_outfile(filepath);
- error = posix_spawn_file_actions_init(&fa);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
- switch(operation) {
- case CHDIR:
- error = posix_spawn_file_actions_addchdir(&fa, dirpath);
+ switch (operation) {
+ case OP_CHDIR:
+ RZ(posix_spawn_file_actions_addchdir(&fa, dirpath));
break;
- case FCHDIR:
- fd = open(dirpath, O_RDONLY);
- ATF_REQUIRE(fd != -1);
-
- error = posix_spawn_file_actions_addfchdir(&fa, fd);
+ case OP_FCHDIR:
+ RL(fd = open(dirpath, O_RDONLY));
+ RZ(posix_spawn_file_actions_addfchdir(&fa, fd));
break;
}
- ATF_REQUIRE(error == 0);
/*
* if POSIX_SPAWN_RETURNERROR is expected, then no need to open the
* file
*/
if (expected_error == 0) {
- error = posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO,
- FILENAME, O_WRONLY, 0);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawn_file_actions_addopen(&fa, STDOUT_FILENO,
+ FILENAME, O_WRONLY, 0));
attr_p = NULL;
} else {
- error = posix_spawnattr_init(&attr);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawnattr_init(&attr));
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
@@ -281,52 +245,56 @@ spawn_chdir(const char *dirpath, const char *filepath, int operation,
* status from the child process (c.f. the non-diag variant
* of this test).
*/
- error = posix_spawnattr_setflags(&attr,
- POSIX_SPAWN_RETURNERROR);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR));
attr_p = &attr;
}
error = posix_spawn(&pid, "/bin/pwd", &fa, attr_p, args, NULL);
- ATF_REQUIRE(error == expected_error);
+ ATF_REQUIRE_MSG(error == expected_error, "error=%d expected_error=%d",
+ error, expected_error);
/* wait for the child to finish only when no spawnattr */
if (attr_p) {
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawnattr_destroy(&attr));
} else {
- waitpid(pid, &status, 0);
- ATF_REQUIRE_MSG(WIFEXITED(status) &&
- WEXITSTATUS(status) == EXIT_SUCCESS,
- "%s", "[f]chdir failed");
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG((WIFEXITED(status) &&
+ WEXITSTATUS(status) == EXIT_SUCCESS),
+ "[f]chdir failed");
}
- posix_spawn_file_actions_destroy(&fa);
+ RZ(posix_spawn_file_actions_destroy(&fa));
/*
* The file incase of fchdir(),
* should be closed before reopening in 'check_success'
*/
if (fd != -1) {
- error = close(fd);
- ATF_REQUIRE(error == 0);
+ RL(close(fd));
}
}
ATF_TC(t_spawn_chdir_abs);
-
ATF_TC_HEAD(t_spawn_chdir_abs, tc)
{
atf_tc_set_md_var(tc, "descr",
"Test posix_spawn_fa_addchdir for absolute path");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_chdir_abs, tc)
{
- spawn_chdir(CHDIRPATH, FILEPATH, 1, 0);
+ char chdirpath[PATH_MAX], filepath[PATH_MAX];
+
+ REQUIRE_LIBC(getcwd(chdirpath, sizeof(chdirpath)), NULL);
+ RL(chdir("/"));
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", chdirpath, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", chdirpath);
+
+ spawn_chdir(chdirpath, filepath, OP_CHDIR, 0);
/* finally cross check the output of "pwd" directory */
- check_success(FILEPATH, 0);
+ check_success(chdirpath, filepath);
}
ATF_TC(t_spawn_chdir_rel);
@@ -338,30 +306,15 @@ ATF_TC_HEAD(t_spawn_chdir_rel, tc)
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_chdir_rel, tc)
{
- int error;
const char *relative_dir = "ch-dir";
const char *testdir = getcwd(NULL, 0);
char *chdirwd, *filepath;
- /* cleanup previous */
- error = asprintf(&filepath, "%s/%s", relative_dir, FILENAME);
- ATF_CHECK(error != -1);
- unlink(filepath);
- free(filepath);
-
- rmdir(relative_dir);
- error = mkdir(relative_dir, 0777);
- ATF_REQUIRE_MSG(error == 0, "mkdir `%s' (%s)", relative_dir,
- strerror(errno));
-
- error = asprintf(&chdirwd, "%s/%s", testdir, relative_dir);
- ATF_CHECK(error != -1);
-
- error = asprintf(&filepath, "%s/%s", chdirwd, FILENAME);
- ATF_CHECK(error != -1);
+ RL(mkdir(relative_dir, 0777));
+ RL(asprintf(&chdirwd, "%s/%s", testdir, relative_dir));
+ RL(asprintf(&filepath, "%s/%s", chdirwd, FILENAME));
#ifdef DEBUG
printf("cwd: %s\n", testdir);
@@ -372,44 +325,43 @@ ATF_TC_BODY(t_spawn_chdir_rel, tc)
spawn_chdir(relative_dir, filepath, 1, 0);
/* finally cross check the directory */
- check_success(filepath, 1, chdirwd);
+ check_success(chdirwd, filepath);
free(chdirwd);
free(filepath);
}
ATF_TC(t_spawn_chdir_file);
-
ATF_TC_HEAD(t_spawn_chdir_file, tc)
{
atf_tc_set_md_var(tc, "descr",
"Test posix_spawn_fa_addchdir on plain file (not a directory)");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_chdir_file, tc)
{
- spawn_chdir(FILEPATH, FILEPATH, 1, ENOTDIR);
+ char cwd[PATH_MAX], filepath[PATH_MAX];
+
+ REQUIRE_LIBC(getcwd(cwd, sizeof(cwd)), NULL);
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", cwd, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", cwd);
- unlink(FILEPATH);
+ spawn_chdir(filepath, filepath, 1, ENOTDIR);
}
ATF_TC(t_spawn_chdir_invalid);
-
ATF_TC_HEAD(t_spawn_chdir_invalid, tc)
{
atf_tc_set_md_var(tc, "descr",
"Test posix_spawn_fa_addchdir for an invalid dir");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_chdir_invalid, tc)
{
spawn_chdir("/not/a/valid/dir", NULL, 1, ENOENT);
-
}
ATF_TC(t_spawn_chdir_permissions);
-
ATF_TC_HEAD(t_spawn_chdir_permissions, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -417,38 +369,38 @@ ATF_TC_HEAD(t_spawn_chdir_permissions, tc)
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
atf_tc_set_md_var(tc, "require.user", "unprivileged");
}
-
ATF_TC_BODY(t_spawn_chdir_permissions, tc)
{
- int error;
- const char *restrRelDir = "prohibited";
+ const char *restricted_dir = "prohibited";
- rmdir(restrRelDir);
- error = mkdir(restrRelDir, 0055);
- ATF_REQUIRE(error == 0);
+ RL(mkdir(restricted_dir, 0055));
- spawn_chdir(restrRelDir, NULL, 1, EACCES);
+ spawn_chdir(restricted_dir, NULL, 1, EACCES);
}
-
ATF_TC(t_spawn_fchdir_abs);
-
ATF_TC_HEAD(t_spawn_fchdir_abs, tc)
{
atf_tc_set_md_var(tc, "descr", "Test posix_spawn_fa_fchdir");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_abs, tc)
{
- spawn_chdir(CHDIRPATH, FILEPATH, 2, 0);
+ char chdirpath[PATH_MAX], filepath[PATH_MAX];
+
+ REQUIRE_LIBC(getcwd(chdirpath, sizeof(chdirpath)), NULL);
+ RL(chdir("/"));
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", chdirpath, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", chdirpath);
+
+ spawn_chdir(chdirpath, filepath, OP_FCHDIR, 0);
/* finally cross check the directory */
- check_success(FILEPATH, 0);
+ check_success(chdirpath, filepath);
}
ATF_TC(t_spawn_fchdir_rel);
-
ATF_TC_HEAD(t_spawn_fchdir_rel, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -456,39 +408,31 @@ ATF_TC_HEAD(t_spawn_fchdir_rel, tc)
"directory");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_rel, tc)
{
- int error;
const char *relative_dir = "ch-dir";
const char *testdir = getcwd(NULL, 0);
char *chdirwd, *filepath;
- rmdir(relative_dir);
- error = mkdir(relative_dir, 0755);
- ATF_REQUIRE(error == 0);
+ RL(mkdir(relative_dir, 0755));
/*
* This is done in parts purposely.
* It enables the abs path of the relative dir
* to be passed to 'check_success()' for comparing
*/
- error = asprintf(&chdirwd, "%s/%s", testdir, relative_dir);
- ATF_CHECK(error != -1);
-
- error = asprintf(&filepath, "%s/%s", chdirwd, FILENAME);
- ATF_CHECK(error != -1);
+ RL(asprintf(&chdirwd, "%s/%s", testdir, relative_dir));
+ RL(asprintf(&filepath, "%s/%s", chdirwd, FILENAME));
spawn_chdir(relative_dir, filepath, 2, 0);
/* finally cross check the directory */
- check_success(filepath, 1, chdirwd);
+ check_success(chdirwd, filepath);
free(chdirwd);
free(filepath);
}
ATF_TC(t_spawn_fchdir_file);
-
ATF_TC_HEAD(t_spawn_fchdir_file, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -496,26 +440,22 @@ ATF_TC_HEAD(t_spawn_fchdir_file, tc)
"regular file (not a directory)");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_file, tc)
{
- int error, fd;
-
- fd = open(FILEPATH, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- ATF_REQUIRE_MSG(fd != -1, "Can't open `%s' (%s)", FILEPATH,
- strerror(errno));
-
- error = close(fd);
- ATF_REQUIRE(error == 0);
-
- spawn_chdir(FILEPATH, NULL, 2, ENOTDIR);
+ char cwd[PATH_MAX], filepath[PATH_MAX];
+ int fd;
- unlink(FILEPATH);
+ REQUIRE_LIBC(getcwd(cwd, sizeof(cwd)), NULL);
+ if (snprintf(filepath, sizeof(filepath), "%s/%s", cwd, FILENAME)
+ >= (int)sizeof(filepath))
+ atf_tc_fail("too deep: %s", cwd);
+ RL(fd = open(FILENAME, O_WRONLY | O_CREAT | O_TRUNC, 0644));
+ RL(close(fd));
+ spawn_chdir(filepath, NULL, 2, ENOTDIR);
}
ATF_TC(t_spawn_fchdir_neg_fd);
-
ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc)
{
atf_tc_set_md_var(tc, "descr",
@@ -523,7 +463,6 @@ ATF_TC_HEAD(t_spawn_fchdir_neg_fd, tc)
"descriptor");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc)
{
int error, fd;
@@ -531,24 +470,21 @@ ATF_TC_BODY(t_spawn_fchdir_neg_fd, tc)
fd = -1;
- error = posix_spawn_file_actions_init(&fa);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawn_file_actions_init(&fa));
error = posix_spawn_file_actions_addfchdir(&fa, fd);
- ATF_REQUIRE(error == EBADF);
+ ATF_REQUIRE_MSG(error == EBADF, "error=%d", error);
- posix_spawn_file_actions_destroy(&fa);
+ RZ(posix_spawn_file_actions_destroy(&fa));
}
ATF_TC(t_spawn_fchdir_closed);
-
ATF_TC_HEAD(t_spawn_fchdir_closed, tc)
{
atf_tc_set_md_var(tc, "descr",
"Testing posix_spawn_file_actions_addfchdir for a closed fd");
atf_tc_set_md_var(tc, "require.progs", "/bin/pwd");
}
-
ATF_TC_BODY(t_spawn_fchdir_closed, tc)
{
int error, fd;
@@ -558,8 +494,7 @@ ATF_TC_BODY(t_spawn_fchdir_closed, tc)
posix_spawn_file_actions_t fa;
fd = 3;
- error = posix_spawnattr_init(&attr);
- ATF_CHECK(error == 0);
+ RZ(posix_spawnattr_init(&attr));
/*
* POSIX_SPAWN_RETURNERROR is a NetBSD specific flag that
* will cause a "proper" return value from posix_spawn(2)
@@ -567,27 +502,57 @@ ATF_TC_BODY(t_spawn_fchdir_closed, tc)
* status from the child process (c.f. the non-diag variant
* of this test).
*/
- error = posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR);
- ATF_REQUIRE(error == 0);
-
- error = posix_spawn_file_actions_init(&fa);
- ATF_REQUIRE(error == 0);
-
- error = posix_spawn_file_actions_addfchdir(&fa, fd);
- ATF_REQUIRE(error == 0);
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RETURNERROR));
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_addfchdir(&fa, fd));
error = posix_spawn(&pid, "/bin/pwd", &fa, &attr, args, NULL);
- ATF_REQUIRE(error == EBADF);
+ ATF_REQUIRE_MSG(error == EBADF, "error=%d", error);
- posix_spawn_file_actions_destroy(&fa);
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawn_file_actions_destroy(&fa));
+ RZ(posix_spawnattr_destroy(&attr));
}
-#undef CHDIR
-#undef FCHDIR
-#undef CHDIRPATH
-#undef FILENAME
-#undef FILEPATH
+ATF_TC(t_spawn_sig);
+ATF_TC_HEAD(t_spawn_sig, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks that posix_spawn does not drop pending signals");
+}
+ATF_TC_BODY(t_spawn_sig, tc)
+{
+ const char *srcdir = atf_tc_get_config_var(tc, "srcdir");
+ char h_execsig[PATH_MAX];
+ time_t start;
+
+ snprintf(h_execsig, sizeof(h_execsig), "%s/../h_execsig", srcdir);
+ REQUIRE_LIBC(signal(SIGPIPE, SIG_IGN), SIG_ERR);
+
+ for (start = time(NULL); time(NULL) - start <= 10;) {
+ int fd[2];
+ char *const argv[] = {h_execsig, NULL};
+ posix_spawn_file_actions_t fa;
+ pid_t pid;
+ int status;
+
+ RL(pipe2(fd, O_CLOEXEC));
+ RZ(posix_spawn_file_actions_init(&fa));
+ RZ(posix_spawn_file_actions_adddup2(&fa, fd[0], STDIN_FILENO));
+ RZ(posix_spawn(&pid, argv[0], &fa, NULL, argv, NULL));
+ RL(close(fd[0]));
+ RL(kill(pid, SIGTERM));
+ if (write(fd[1], (char[]){0}, 1) == -1 && errno != EPIPE)
+ atf_tc_fail("write failed: %s", strerror(errno));
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG(WIFSIGNALED(status),
+ "child exited with status 0x%x", status);
+ ATF_REQUIRE_EQ_MSG(WTERMSIG(status), SIGTERM,
+ "child exited on signal %d (%s)",
+ WTERMSIG(status), strsignal(WTERMSIG(status)));
+ RL(close(fd[1]));
+ RZ(posix_spawn_file_actions_destroy(&fa));
+ }
+}
ATF_TP_ADD_TCS(tp)
{
@@ -607,6 +572,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, t_spawn_fchdir_file);
ATF_TP_ADD_TC(tp, t_spawn_fchdir_neg_fd);
ATF_TP_ADD_TC(tp, t_spawn_fchdir_closed);
+ ATF_TP_ADD_TC(tp, t_spawn_sig);
return atf_no_error();
}
diff --git a/lib/libc/gen/posix_spawn/t_spawnattr.c b/lib/libc/gen/posix_spawn/t_spawnattr.c
index b2cc30729a83..2284fb8903e3 100644
--- a/lib/libc/gen/posix_spawn/t_spawnattr.c
+++ b/lib/libc/gen/posix_spawn/t_spawnattr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_spawnattr.c,v 1.6 2022/05/23 21:46:12 andvar Exp $ */
+/* $NetBSD: t_spawnattr.c,v 1.7 2025/03/16 15:35:36 riastradh Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,32 +29,39 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_spawnattr.c,v 1.6 2022/05/23 21:46:12 andvar Exp $");
+__RCSID("$NetBSD: t_spawnattr.c,v 1.7 2025/03/16 15:35:36 riastradh Exp $");
#include <sys/param.h>
+#include <sys/wait.h>
+
#include <atf-c.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sched.h>
#include <signal.h>
#include <spawn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
-#include <sys/wait.h>
+
+#include "h_macros.h"
static int
get_different_scheduler(void)
{
+ int sched;
+
/*
* We don't want to use SCHED_OTHER because it does not have
* different priorities.
*/
/* get current schedule policy */
- switch (sched_getscheduler(0)) {
+ RL(sched = sched_getscheduler(0));
+ switch (sched) {
case SCHED_RR:
return SCHED_FIFO;
case SCHED_FIFO:
@@ -72,17 +79,17 @@ get_different_priority(int scheduler)
struct sched_param param;
/* Get the priority range for the new scheduler */
- max = sched_get_priority_max(scheduler);
- min = sched_get_priority_min(scheduler);
+ RL(max = sched_get_priority_max(scheduler));
+ RL(min = sched_get_priority_min(scheduler));
- sched_getparam(0, &param);
+ RL(sched_getparam(0, &param));
priority = param.sched_priority;
-
+
/* new schedule policy */
for (new = min; new <= max; new++)
if (priority != new)
break;
-
+
ATF_REQUIRE_MSG(priority != new, "could not find different priority");
printf("min %d max %d for scheduler %d, returning %d\n",
min, max, scheduler, new);
@@ -90,17 +97,15 @@ get_different_priority(int scheduler)
}
ATF_TC(t_spawnattr);
-
ATF_TC_HEAD(t_spawnattr, tc)
{
atf_tc_set_md_var(tc, "require.user", "root");
atf_tc_set_md_var(tc, "descr",
"Tests posix_spawn with scheduler attributes");
}
-
ATF_TC_BODY(t_spawnattr, tc)
{
- int pid, scheduler, child_scheduler, priority, status, err, pfd[2];
+ int pid, scheduler, child_scheduler, priority, status, pfd[2];
char helper_arg[128];
char * const args[] = { __UNCONST("h_spawnattr"), helper_arg, NULL };
struct sched_param sp, child_sp;
@@ -111,41 +116,40 @@ ATF_TC_BODY(t_spawnattr, tc)
/*
* create a pipe to control the child
*/
- err = pipe(pfd);
- ATF_REQUIRE_MSG(err == 0, "could not create pipe, errno %d", errno);
- sprintf(helper_arg, "%d", pfd[0]);
+ RL(pipe(pfd));
+ snprintf(helper_arg, sizeof(helper_arg), "%d", pfd[0]);
- posix_spawnattr_init(&attr);
+ RZ(posix_spawnattr_init(&attr));
scheduler = get_different_scheduler();
priority = get_different_priority(scheduler);
sp.sched_priority = priority;
printf("using scheduler %d, priority %d\n", scheduler, priority);
-
- sigemptyset(&sig);
- sigaddset(&sig, SIGUSR1);
- posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSCHEDULER |
+ RL(sigemptyset(&sig));
+ RL(sigaddset(&sig, SIGUSR1));
+
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_SETSCHEDULER |
POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETPGROUP |
POSIX_SPAWN_SETSIGMASK | POSIX_SPAWN_SETSIGDEF |
- POSIX_SPAWN_SETSIGDEF);
- posix_spawnattr_setpgroup(&attr, 0);
- posix_spawnattr_setschedparam(&attr, &sp);
- posix_spawnattr_setschedpolicy(&attr, scheduler);
- posix_spawnattr_setsigmask(&attr, &sig);
- posix_spawnattr_setsigdefault(&attr, &sig);
+ POSIX_SPAWN_SETSIGDEF));
+ RZ(posix_spawnattr_setpgroup(&attr, 0));
+ RZ(posix_spawnattr_setschedparam(&attr, &sp));
+ RZ(posix_spawnattr_setschedpolicy(&attr, scheduler));
+ RZ(posix_spawnattr_setsigmask(&attr, &sig));
+ RZ(posix_spawnattr_setsigdefault(&attr, &sig));
- sprintf(helper, "%s/h_spawnattr",
+ snprintf(helper, sizeof(helper), "%s/h_spawnattr",
atf_tc_get_config_var(tc, "srcdir"));
- err = posix_spawn(&pid, helper, NULL, &attr, args, NULL);
- ATF_REQUIRE_MSG(err == 0, "error %d", err);
+ RZ(posix_spawn(&pid, helper, NULL, &attr, args, NULL));
+ ATF_REQUIRE_MSG(pid > 0, "pid=%lld", (long long)pid);
- child_scheduler = sched_getscheduler(pid);
+ RL(child_scheduler = sched_getscheduler(pid));
ATF_REQUIRE_MSG(scheduler == child_scheduler,
"scheduler = %d, child_scheduler = %d, pid %d, errno %d",
scheduler, child_scheduler, pid, errno);
- sched_getparam(pid, &child_sp);
+ RL(sched_getparam(pid, &child_sp));
ATF_REQUIRE_MSG(child_sp.sched_priority == sp.sched_priority,
"priority is: %d, but we requested: %d",
child_sp.sched_priority, sp.sched_priority);
@@ -154,15 +158,15 @@ ATF_TC_BODY(t_spawnattr, tc)
pid, getpgid(pid));
/* ready, let child go */
- write(pfd[1], "q", 1);
- close(pfd[0]);
- close(pfd[1]);
+ RL(write(pfd[1], "q", 1));
+ RL(close(pfd[0]));
+ RL(close(pfd[1]));
/* wait and check result from child */
- waitpid(pid, &status, 0);
+ RL(waitpid(pid, &status, 0));
ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawnattr_destroy(&attr));
}
ATF_TC(t_spawn_resetids);
@@ -180,22 +184,22 @@ ATF_TC_BODY(t_spawn_resetids, tc)
__UNCONST("h_spawn"), __UNCONST("--resetids"), NULL
};
posix_spawnattr_t attr;
- int err, status;
+ int status;
pid_t pid;
- posix_spawnattr_init(&attr);
- posix_spawnattr_setflags(&attr, POSIX_SPAWN_RESETIDS);
+ RZ(posix_spawnattr_init(&attr));
+ RZ(posix_spawnattr_setflags(&attr, POSIX_SPAWN_RESETIDS));
- snprintf(buf, sizeof buf, "%s/h_spawn",
+ snprintf(buf, sizeof(buf), "%s/h_spawn",
atf_tc_get_config_var(tc, "srcdir"));
- err = posix_spawn(&pid, buf, NULL, &attr, args, NULL);
- ATF_REQUIRE(err == 0);
- ATF_REQUIRE(pid > 0);
- waitpid(pid, &status, 0);
- ATF_REQUIRE(WIFEXITED(status) && WEXITSTATUS(status) == 0);
+ RZ(posix_spawn(&pid, buf, NULL, &attr, args, NULL));
+ ATF_REQUIRE_MSG(pid > 0, "pid=%lld", (long long)pid);
+ RL(waitpid(pid, &status, 0));
+ ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == 0,
+ "status=0x%x", status);
- posix_spawnattr_destroy(&attr);
+ RZ(posix_spawnattr_destroy(&attr));
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libc/gen/t_floatunditf.c b/lib/libc/gen/t_floatunditf.c
index ef372f76762b..7230fd4a057e 100644
--- a/lib/libc/gen/t_floatunditf.c
+++ b/lib/libc/gen/t_floatunditf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_floatunditf.c,v 1.6 2014/11/04 00:20:19 justin Exp $ */
+/* $NetBSD: t_floatunditf.c,v 1.7 2024/05/06 17:53:43 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -26,15 +26,23 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_floatunditf.c,v 1.7 2024/05/06 17:53:43 riastradh Exp $");
+
#include <atf-c.h>
+#include <float.h>
#include <inttypes.h>
#include <math.h>
-#ifdef __HAVE_LONG_DOUBLE
+#if LDBL_MANT_DIG < 53
+#error Unsupported long double format
+#endif
+
static const struct {
uint64_t u64;
long double ld;
} testcases[] = {
+#if LDBL_MANT_DIG >= 64
{ 0xffffffffffffffffULL, 0xf.fffffffffffffffp+60L },
{ 0xfffffffffffffffeULL, 0xf.ffffffffffffffep+60L },
{ 0xfffffffffffffffdULL, 0xf.ffffffffffffffdp+60L },
@@ -46,9 +54,12 @@ static const struct {
{ 0x7ffffffffffffffULL, 0xf.fffffffffffffep+55L },
{ 0x3ffffffffffffffULL, 0xf.fffffffffffffcp+54L },
{ 0x1ffffffffffffffULL, 0xf.fffffffffffff8p+53L },
+#endif
+#if LDBL_MANT_DIG >= 56
{ 0xffffffffffffffULL, 0xf.fffffffffffffp+52L },
{ 0x7fffffffffffffULL, 0xf.ffffffffffffep+51L },
{ 0x3fffffffffffffULL, 0xf.ffffffffffffcp+50L },
+#endif
{ 0x1fffffffffffffULL, 0xf.ffffffffffff8p+49L },
{ 0xfffffffffffffULL, 0xf.ffffffffffffp+48L },
{ 0x7ffffffffffffULL, 0xf.fffffffffffep+47L },
@@ -103,7 +114,6 @@ static const struct {
{ 0x3ULL, 0xcp-2L },
{ 0x1ULL, 0x8p-3L },
};
-#endif
ATF_TC(floatunditf);
ATF_TC_HEAD(floatunditf, tc)
@@ -114,9 +124,6 @@ ATF_TC_HEAD(floatunditf, tc)
ATF_TC_BODY(floatunditf, tc)
{
-#ifndef __HAVE_LONG_DOUBLE
- atf_tc_skip("Requires long double support");
-#else
size_t i;
for (i = 0; i < __arraycount(testcases); ++i)
@@ -125,7 +132,6 @@ ATF_TC_BODY(floatunditf, tc)
"#%zu: expected %.20Lf, got %.20Lf\n", i,
testcases[i].ld,
(long double)testcases[i].u64);
-#endif
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libc/gen/t_fmtcheck.c b/lib/libc/gen/t_fmtcheck.c
index 196558fbf597..7381bca993ac 100644
--- a/lib/libc/gen/t_fmtcheck.c
+++ b/lib/libc/gen/t_fmtcheck.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fmtcheck.c,v 1.5 2017/12/13 06:47:04 rin Exp $ */
+/* $NetBSD: t_fmtcheck.c,v 1.6 2024/04/13 14:02:51 rillig Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -75,6 +75,10 @@ struct test_fmt {
{ "%ld %30s %#llx %-10.*e", "This number %lu%% and string %s has %qd numbers and %.*g floats", 1 },
{ "%o", "%lx", 2 },
{ "%p", "%lu", 2 },
+ // When fmtcheck supports '$', it could be used in dcngettext.
+ { "%1$s", "%s", 2 },
+ { "%1$s %2$s", "%s %s", 2 },
+ { "%2$d %1$s", "%s %d", 2 },
};
ATF_TC(fmtcheck_basic);
diff --git a/lib/libc/gen/t_fpclassify.c b/lib/libc/gen/t_fpclassify.c
index 21dea9e8fee7..c4e61c5f7829 100644
--- a/lib/libc/gen/t_fpclassify.c
+++ b/lib/libc/gen/t_fpclassify.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fpclassify.c,v 1.3 2011/10/01 21:47:08 christos Exp $ */
+/* $NetBSD: t_fpclassify.c,v 1.14 2025/12/23 17:11:42 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -26,27 +26,229 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <atf-c.h>
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_fpclassify.c,v 1.14 2025/12/23 17:11:42 riastradh Exp $");
+
+#include <sys/endian.h>
+#include <atf-c.h>
+#include <fenv.h>
#include <float.h>
+#include <inttypes.h>
#include <math.h>
+#include <stdint.h>
#include <stdio.h>
#include <string.h>
-#ifndef _FLOAT_IEEE754
+/* XXX copied from include/fenv.h -- factor me out, please! */
+#if \
+ (defined(__arm__) && defined(__SOFTFP__)) || \
+ (defined(__m68k__) && !defined(__HAVE_68881__)) || \
+ defined(__mips_soft_float) || \
+ (defined(__powerpc__) && defined(_SOFT_FLOAT)) || \
+ (defined(__sh__) && !defined(__SH_FPU_ANY__)) || \
+ 0
+#define SOFTFLOAT
+#endif
+
+/*
+ * Some ports use softfloat for long double even if they use hardfloat
+ * for other floating-point operations, often if the long double ABI is
+ * 128-bit for which essentially no hardware actually exists.
+ *
+ * XXX Not copied from anywhere -- find a place for me, please!
+ */
+#if defined SOFTFLOAT || defined __aarch64__ || defined __sparc64__
+#define SOFTFLOAT_LONG_DOUBLE
+#endif
+
+#ifdef _FLOAT_IEEE754
+
+#include <machine/ieee.h>
+
+# if defined __hppa__ || defined __mips__ /* just, why? */
+# define QNANBIT 0
+# define SNANBIT 1
+# else
+# define QNANBIT 1
+# define SNANBIT 0
+# endif
+
+# define FLT_QNANBIT (QNANBIT*__BIT(FLT_MANT_DIG - 2))
+# define FLT_SNANBIT (SNANBIT*__BIT(FLT_MANT_DIG - 2))
+
+static float
+makequietsignallingf(float f, uint32_t bit)
+{
+ union { float f; uint32_t i; } u = { .f = f };
+
+ u.i &= ~(FLT_QNANBIT|FLT_SNANBIT);
+ u.i |= bit;
+ if (bit == 0)
+ u.i |= 1; /* significand all zero would be inf */
+
+ return u.f;
+}
+
+# define DBL_QNANBIT (QNANBIT*__BIT(DBL_MANT_DIG - 2))
+# define DBL_SNANBIT (SNANBIT*__BIT(DBL_MANT_DIG - 2))
+
+static double
+makequietsignalling(double f, uint64_t bit)
+{
+ union { double f; uint64_t i; } u = { .f = f };
+
+ u.i &= ~(DBL_QNANBIT|DBL_SNANBIT);
+ u.i |= bit;
+ if (bit == 0)
+ u.i |= 1; /* significand all zero would be inf */
+
+ return u.f;
+}
+
+# ifdef __HAVE_LONG_DOUBLE
+
+/* long double is not the same as double */
+
+# define LDBL_QNANBITH \
+ (QNANBIT*__BIT(LDBL_MANT_DIG - 2 - EXT_FRACLBITS))
+# define LDBL_SNANBITH \
+ (SNANBIT*__BIT(LDBL_MANT_DIG - 2 - EXT_FRACLBITS))
+
+static long double
+makequietsignallingl(long double f, uint64_t bith)
+{
+ union ieee_ext_u u = { .extu_ld = f };
+
+ u.extu_ld = f;
+ u.extu_frach &= ~(LDBL_QNANBITH|LDBL_SNANBITH);
+ u.extu_frach |= bith;
+ if (bith == 0)
+ u.extu_fracl |= 1; /* significand all zero would be inf */
+ return u.extu_ld;
+}
+
+# else /* !__HAVE_LONG_DOUBLE */
+
+/* long double is the same as double */
+
+# define LDBL_QNANBITH DBL_QNANBIT
+# define LDBL_SNANBITH DBL_SNANBIT
+# define makequietsignallingl makequietsignalling
+
+# endif
+
+static const char *
+formatbitsf(float f)
+{
+ static char buf[2*sizeof(f) + 1];
+ union { float f; uint32_t i; } u = { .f = f };
+
+ __CTASSERT(sizeof(f) <= sizeof(u));
+ snprintf(buf, sizeof(buf), "%08"PRIx32, u.i);
+
+ return buf;
+}
+
+static const char *
+formatbits(double f)
+{
+ static char buf[2*sizeof(f) + 1];
+ union { double f; uint64_t i; } u = { .f = f };
+
+ __CTASSERT(sizeof(f) <= sizeof(u));
+ snprintf(buf, sizeof(buf), "%016"PRIx64, u.i);
+
+ return buf;
+}
+
+static const char *
+formatbitsl(long double f)
+{
+ static char buf[2*sizeof(f) + 1];
+ union {
+ long double f;
+ uint64_t i[sizeof(long double)/sizeof(double)];
+ } u = { .f = f };
+ size_t i, j, n = __arraycount(u.i);
+
+ __CTASSERT(sizeof(f) <= sizeof(u));
+#if _BYTE_ORDER == _BIG_ENDIAN
+ for (i = j = 0; j < n; i++, j++)
+#elif _BYTE_ORDER == _LITTLE_ENDIAN
+ for (i = 0, j = n; j --> 0; i++)
+#else
+# error Unknown byte order
+#endif
+ snprintf(buf + 16*i, 16 + 1, "%016"PRIx64, u.i[j]);
+
+ return buf;
+}
+
+#endif
+
+#ifdef __HAVE_FENV
+# define CLEAREXCEPT() feclearexcept(FE_ALL_EXCEPT)
+# define CHECKEXCEPT() do \
+{ \
+ int _except = fetestexcept(FE_ALL_EXCEPT); \
+ ATF_CHECK_MSG(_except == 0, \
+ "expected no exceptions, got 0x%x", _except); \
+} while (0)
+#else
+# define CLEAREXCEPT() __nothing
+# define CHECKEXCEPT() __nothing
+#endif
+
+#if __STDC_VERSION__ - 0 >= 202311L
+
+# define HAVE_ISSIGNALLING
+
+#else /* __STDC_VERSION__ - 0 < 202311L */
+
+# ifndef issubnormal
+# define issubnormal(x) (fpclassify(x) == FP_SUBNORMAL)
+# endif
+
+# ifndef iszero
+# define iszero(x) (fpclassify(x) == FP_ZERO)
+# endif
+
+# if !defined issignalling && defined _FLOAT_IEEE754
-ATF_TC(no_test);
-ATF_TC_HEAD(no_test, tc)
+# define HAVE_ISSIGNALLING
+# define issignalling(x) __fpmacro_unary_floating(issignalling, x)
+
+static bool
+__issignallingf(float f)
+{
+ union { float f; uint32_t i; } u = { .f = f };
+
+ return isnan(f) && (u.i & (FLT_SNANBIT|FLT_QNANBIT)) == FLT_SNANBIT;
+}
+
+static bool
+__issignallingd(double f)
{
- atf_tc_set_md_var(tc, "descr", "Dummy test");
+ union { double f; uint64_t i; } u = { .f = f };
+
+ return isnan(f) && (u.i & (DBL_SNANBIT|DBL_QNANBIT)) == DBL_SNANBIT;
}
-ATF_TC_BODY(no_test,tc)
+# ifdef __HAVE_LONG_DOUBLE
+static bool
+__issignallingl(long double f)
{
- atf_tc_skip("Test not available on this architecture");
+ union ieee_ext_u u = { .extu_ld = f };
+
+ return isnan(f) &&
+ ((u.extu_frach & (LDBL_SNANBITH|LDBL_QNANBITH)) == LDBL_SNANBITH);
}
+# endif
+
+# endif /* !defined issignalling && defined _FLOAT_IEEE754 */
-#else /* defined(_FLOAT_IEEE754) */
+#endif /* __STDC_VERSION__ < 202311L */
ATF_TC(fpclassify_float);
ATF_TC_HEAD(fpclassify_float, tc)
@@ -57,39 +259,320 @@ ATF_TC_HEAD(fpclassify_float, tc)
ATF_TC_BODY(fpclassify_float, tc)
{
- float d0, d1, d2, f, ip;
- int e, i;
+ volatile float d0, d1, f;
+ int e;
d0 = FLT_MIN;
- ATF_REQUIRE_EQ(fpclassify(d0), FP_NORMAL);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnormal(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d0), FP_NORMAL,
+ "fpclassify(%a)=%d FP_NORMAL=%d",
+ d0, fpclassify(d0), FP_NORMAL);
+ CHECKEXCEPT();
f = frexpf(d0, &e);
- ATF_REQUIRE_EQ(e, FLT_MIN_EXP);
- ATF_REQUIRE_EQ(f, 0.5);
+ ATF_CHECK_EQ_MSG(e, FLT_MIN_EXP,
+ "frexpf(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d0, f, e, 0.5, FLT_MIN_EXP);
+ ATF_CHECK_EQ_MSG(f, 0.5,
+ "frexpf(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d0, f, e, 0.5, FLT_MIN_EXP);
d1 = d0;
+#if __FLT_HAS_DENORM__
/* shift a "1" bit through the mantissa (skip the implicit bit) */
- for (i = 1; i < FLT_MANT_DIG; i++) {
+ for (int i = 1; i < FLT_MANT_DIG; i++) {
+ float d2, ip;
+
d1 /= 2;
- ATF_REQUIRE_EQ(fpclassify(d1), FP_SUBNORMAL);
- ATF_REQUIRE(d1 > 0 && d1 < d0);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(issubnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d1), FP_SUBNORMAL,
+ "[%d] fpclassify(%a)=%d FP_SUBNORMAL=%d",
+ i, d1, fpclassify(d1), FP_SUBNORMAL);
+ CHECKEXCEPT();
+ ATF_CHECK_MSG(d1 > 0 && d1 < d0,
+ "[%d] d1=%a d0=%a", i, d1, d0);
d2 = ldexpf(d0, -i);
- ATF_REQUIRE_EQ(d2, d1);
+ ATF_CHECK_EQ_MSG(d2, d1, "[%d] ldexpf(%a, -%d)=%a != %a",
+ i, d0, i, d2, d1);
d2 = modff(d1, &ip);
- ATF_REQUIRE_EQ(d2, d1);
- ATF_REQUIRE_EQ(ip, 0);
+ ATF_CHECK_EQ_MSG(d2, d1,
+ "[%d] modff(%a) returned int %a, frac %a;"
+ " expected int %a, frac %a",
+ i, d1, ip, d2, 0., d1);
+ ATF_CHECK_EQ_MSG(ip, 0,
+ "[%d] modff(%a) returned int %a, frac %a;"
+ " expected int %a, frac %a",
+ i, d1, ip, d2, 0., d1);
f = frexpf(d1, &e);
- ATF_REQUIRE_EQ(e, FLT_MIN_EXP - i);
- ATF_REQUIRE_EQ(f, 0.5);
+ ATF_CHECK_EQ_MSG(e, FLT_MIN_EXP - i,
+ "[%d] frexpf(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ i, d1, f, e, 0.5, FLT_MIN_EXP - i);
+ ATF_CHECK_EQ_MSG(f, 0.5,
+ "[%d] frexpf(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ i, d1, f, e, 0.5, FLT_MIN_EXP - i);
}
+#endif
d1 /= 2;
- ATF_REQUIRE_EQ(fpclassify(d1), FP_ZERO);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(iszero(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d1), FP_ZERO,
+ "fpclassify(%a)=%d FP_ZERO=%d",
+ d1, fpclassify(d1), FP_ZERO);
+ CHECKEXCEPT();
f = frexpf(d1, &e);
- ATF_REQUIRE_EQ(e, 0);
- ATF_REQUIRE_EQ(f, 0);
+ ATF_CHECK_EQ_MSG(e, 0,
+ "frexpf(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d1, f, e, 0., 0);
+ ATF_CHECK_EQ_MSG(f, 0,
+ "frexpf(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d1, f, e, 0., 0);
+
+ if (isinf((float)INFINITY)) {
+ volatile float inf = INFINITY;
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isinf(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(inf), FP_INFINITE,
+ "fpclassify(%a)=%d FP_INFINITE=%d",
+ inf, fpclassify(inf), FP_INFINITE);
+ CHECKEXCEPT();
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isinf(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(-inf), FP_INFINITE,
+ "fpclassify(%a)=%d FP_INFINITE=%d",
+ -inf, fpclassify(inf), FP_INFINITE);
+ CHECKEXCEPT();
+ } else {
+#ifdef _FLOAT_IEEE754
+ atf_tc_fail_nonfatal("isinf((float)INFINITY=%a) failed",
+ (float)INFINITY);
+#endif
+ }
+
+#ifdef NAN
+ {
+ volatile float nan = NAN;
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ (void)issignalling(nan); /* could be quiet or signalling */
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%a [0x%s]", nan,
+ formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%a [0x%s])=%d FP_NAN=%d",
+ nan, formatbitsf(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+#ifdef _FLOAT_IEEE754
+ /* test a quiet NaN */
+ nan = makequietsignallingf(NAN, FLT_QNANBIT);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(nan), "nan=%a [0x%s]", nan,
+ formatbitsf(nan));
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%a [0x%s]", nan,
+ formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%a [0x%s])=%d FP_NAN=%d",
+ nan, formatbitsf(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+ /* verify quiet NaN doesn't provoke exception */
+ CLEAREXCEPT();
+ volatile float y = nan + nan;
+ (void)y;
+ CHECKEXCEPT();
+
+ /* test a signalling NaN */
+ nan = makequietsignallingf(NAN, FLT_SNANBIT);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(issignalling(nan), "nan=%a [0x%s]", nan,
+ formatbitsf(nan));
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%a [0x%s]", nan,
+ formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%a [0x%s])=%d FP_NAN=%d",
+ nan, formatbitsf(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+ /* verify signalling NaN does provoke exception */
+ CLEAREXCEPT();
+#if defined __clang__ && defined SOFTFLOAT
+ /*
+ * The softfloat implementation in compiler-rt used by clang
+ * builds has no floating-point exceptions, so any ports with
+ * softfloat ABI will fail this test.
+ */
+ atf_tc_expect_fail("PR lib/59853:"
+ " compiler-rt softfloat lacks floating-point exceptions");
+#endif
+ volatile float z = nan + nan;
+ (void)z;
+ ATF_CHECK_MSG(fetestexcept(FE_INVALID),
+ "signalling NaN %a [0x%s] failed to raise invalid operation",
+ nan, formatbitsf(nan));
+#endif
+ }
+#endif
}
ATF_TC(fpclassify_double);
@@ -101,47 +584,320 @@ ATF_TC_HEAD(fpclassify_double, tc)
ATF_TC_BODY(fpclassify_double, tc)
{
- double d0, d1, d2, f, ip;
- int e, i;
+ volatile double d0, d1, f;
+ int e;
d0 = DBL_MIN;
- ATF_REQUIRE_EQ(fpclassify(d0), FP_NORMAL);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnormal(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(d0), "d0=%a", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d0), FP_NORMAL,
+ "fpclassify(%a)=%d FP_NORMAL=%d",
+ d0, fpclassify(d0), FP_NORMAL);
+ CHECKEXCEPT();
f = frexp(d0, &e);
- ATF_REQUIRE_EQ(e, DBL_MIN_EXP);
- ATF_REQUIRE_EQ(f, 0.5);
+ ATF_CHECK_EQ_MSG(e, DBL_MIN_EXP,
+ "frexp(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d0, f, e, 0.5, DBL_MIN_EXP);
+ ATF_CHECK_EQ_MSG(f, 0.5,
+ "frexp(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d0, f, e, 0.5, DBL_MIN_EXP);
d1 = d0;
+#if __DBL_HAS_DENORM__
/* shift a "1" bit through the mantissa (skip the implicit bit) */
- for (i = 1; i < DBL_MANT_DIG; i++) {
+ for (int i = 1; i < DBL_MANT_DIG; i++) {
+ double d2, ip;
+
d1 /= 2;
- ATF_REQUIRE_EQ(fpclassify(d1), FP_SUBNORMAL);
- ATF_REQUIRE(d1 > 0 && d1 < d0);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(issubnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d1), FP_SUBNORMAL,
+ "[%d] fpclassify(%a)=%d FP_SUBNORMAL=%d",
+ i, d1, fpclassify(d1), FP_SUBNORMAL);
+ CHECKEXCEPT();
+ ATF_CHECK_MSG(d1 > 0 && d1 < d0,
+ "[%d] d1=%a d0=%a", i, d1, d0);
d2 = ldexp(d0, -i);
- ATF_REQUIRE_EQ(d2, d1);
+ ATF_CHECK_EQ_MSG(d2, d1, "[%d] ldexp(%a, -%d)=%a != %a",
+ i, d0, i, d2, d1);
d2 = modf(d1, &ip);
- ATF_REQUIRE_EQ(d2, d1);
- ATF_REQUIRE_EQ(ip, 0);
+ ATF_CHECK_EQ_MSG(d2, d1,
+ "[%d] modf(%a) returned int %a, frac %a;"
+ " expected int %a, frac %a",
+ i, d1, ip, d2, 0., d1);
+ ATF_CHECK_EQ_MSG(ip, 0,
+ "[%d] modf(%a) returned int %a, frac %a;"
+ " expected int %a, frac %a",
+ i, d1, ip, d2, 0., d1);
f = frexp(d1, &e);
- ATF_REQUIRE_EQ(e, DBL_MIN_EXP - i);
- ATF_REQUIRE_EQ(f, 0.5);
+ ATF_CHECK_EQ_MSG(e, DBL_MIN_EXP - i,
+ "[%d] frexp(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ i, d1, f, e, 0.5, DBL_MIN_EXP - i);
+ ATF_CHECK_EQ_MSG(f, 0.5,
+ "[%d] frexp(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ i, d1, f, e, 0.5, DBL_MIN_EXP - i);
}
+#endif
d1 /= 2;
- ATF_REQUIRE_EQ(fpclassify(d1), FP_ZERO);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(iszero(d1), "d1=%a", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d1), FP_ZERO,
+ "fpclassify(%a)=%d FP_ZERO=%d",
+ d1, fpclassify(d1), FP_ZERO);
+ CHECKEXCEPT();
f = frexp(d1, &e);
- ATF_REQUIRE_EQ(e, 0);
- ATF_REQUIRE_EQ(f, 0);
-}
+ ATF_CHECK_EQ_MSG(e, 0,
+ "frexp(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d1, f, e, 0., 0);
+ ATF_CHECK_EQ_MSG(f, 0,
+ "frexp(%a) returned normalized %a, exponent %d;"
+ " expected normalized %a, exponent %d",
+ d1, f, e, 0., 0);
-/*
- * XXX NetBSD doesn't have long-double flavors of frexp, ldexp, and modf,
- * XXX so this test is disabled.
- */
+ if (isinf(INFINITY)) {
+ volatile double inf = INFINITY;
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isinf(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(inf), "inf=%a", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(inf), FP_INFINITE,
+ "fpclassify(%a)=%d FP_INFINITE=%d",
+ inf, fpclassify(inf), FP_INFINITE);
+ CHECKEXCEPT();
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isinf(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(-inf), "-inf=%a", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(-inf), FP_INFINITE,
+ "fpclassify(%a)=%d FP_INFINITE=%d",
+ -inf, fpclassify(-inf), FP_INFINITE);
+ CHECKEXCEPT();
+ } else {
+#ifdef _FLOAT_IEEE754
+ atf_tc_fail_nonfatal("isinf(INFINITY=%a) failed", INFINITY);
+#endif
+ }
-#ifdef TEST_LONG_DOUBLE
+#ifdef NAN
+ {
+ volatile double nan = NAN;
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ (void)issignalling(nan); /* could be quiet or signalling */
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%a [0x%s]", nan,
+ formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%a [0x%s]", nan, formatbitsf(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%a [0x%s])=%d FP_NAN=%d",
+ nan, formatbitsf(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+#ifdef _FLOAT_IEEE754
+ /* test a quiet NaN */
+ nan = makequietsignalling(NAN, DBL_QNANBIT);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(nan), "nan=%a [0x%s]", nan,
+ formatbits(nan));
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%a [0x%s]", nan,
+ formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%a [0x%s])=%d FP_NAN=%d",
+ nan, formatbits(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+ /* verify quiet NaN doesn't provoke exception */
+ CLEAREXCEPT();
+ volatile double y = nan + nan;
+ (void)y;
+ CHECKEXCEPT();
+
+ /* test a signalling NaN */
+ nan = makequietsignalling(NAN, DBL_SNANBIT);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(issignalling(nan), "nan=%a [0x%s]", nan,
+ formatbits(nan));
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%a [0x%s]", nan,
+ formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%a [0x%s]", nan, formatbits(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%a [0x%s])=%d FP_NAN=%d",
+ nan, formatbits(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+ /* verify signalling NaN does provoke exception */
+#if defined __clang__ && defined SOFTFLOAT
+ /*
+ * The softfloat implementation in compiler-rt used by clang
+ * builds has no floating-point exceptions, so any ports with
+ * softfloat ABI will fail this test.
+ */
+ atf_tc_expect_fail("PR lib/59853:"
+ " compiler-rt softfloat lacks floating-point exceptions");
+#endif
+ CLEAREXCEPT();
+ volatile double z = nan + nan;
+ (void)z;
+ ATF_CHECK_MSG(fetestexcept(FE_INVALID),
+ "signalling NaN %a [0x%s] failed to raise invalid operation",
+ nan, formatbits(nan));
+#endif
+ }
+#endif
+}
ATF_TC(fpclassify_long_double);
ATF_TC_HEAD(fpclassify_long_double, tc)
@@ -152,55 +908,330 @@ ATF_TC_HEAD(fpclassify_long_double, tc)
ATF_TC_BODY(fpclassify_long_double, tc)
{
- long double d0, d1, d2, f, ip;
- int e, i;
+ volatile long double d0, d1, f;
+ int e;
d0 = LDBL_MIN;
- ATF_REQUIRE_EQ(fpclassify(d0), FP_NORMAL);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d0), "d0=%La", d0);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d0), "d0=%La", d0);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d0), "d0=%La", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnormal(d0), "d0=%La", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(d0), "d0=%La", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(d0), "d0=%La", d0);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d0), FP_NORMAL,
+ "fpclassify(%La)=%d FP_NORMAL=%d",
+ d0, fpclassify(d0), FP_NORMAL);
+ CHECKEXCEPT();
f = frexpl(d0, &e);
- ATF_REQUIRE_EQ(e, LDBL_MIN_EXP);
- ATF_REQUIRE_EQ(f, 0.5);
+ ATF_CHECK_EQ_MSG(e, LDBL_MIN_EXP,
+ "frexpl(%La) returned normalized %La, exponent %d;"
+ " expected normalized %La, exponent %d",
+ d0, f, e, 0.5L, LDBL_MIN_EXP);
+ ATF_CHECK_EQ_MSG(f, 0.5,
+ "frexpl(%La) returned normalized %La, exponent %d;"
+ " expected normalized %La, exponent %d",
+ d0, f, e, 0.5L, LDBL_MIN_EXP);
d1 = d0;
+#if __LDBL_HAS_DENORM__
/* shift a "1" bit through the mantissa (skip the implicit bit) */
- for (i = 1; i < LDBL_MANT_DIG; i++) {
+ for (int i = 1; i < LDBL_MANT_DIG; i++) {
+ long double d2, ip;
+
d1 /= 2;
- ATF_REQUIRE_EQ(fpclassify(d1), FP_SUBNORMAL);
- ATF_REQUIRE(d1 > 0 && d1 < d0);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(issubnormal(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d1), FP_SUBNORMAL,
+ "[%d] fpclassify(%La)=%d FP_SUBNORMAL=%d",
+ i, d1, fpclassify(d1), FP_SUBNORMAL);
+ CHECKEXCEPT();
+ ATF_CHECK_MSG(d1 > 0 && d1 < d0,
+ "[%d] d1=%La d0=%La", i, d1, d0);
d2 = ldexpl(d0, -i);
- ATF_REQUIRE_EQ(d2, d1);
+ ATF_CHECK_EQ_MSG(d2, d1, "[%d] ldexpl(%La, -%d)=%La != %La",
+ i, d0, i, d2, d1);
d2 = modfl(d1, &ip);
- ATF_REQUIRE_EQ(d2, d1);
- ATF_REQUIRE_EQ(ip, 0);
+ ATF_CHECK_EQ_MSG(d2, d1,
+ "[%d] modfl(%La) returned int %La, frac %La;"
+ " expected int %La, frac %La",
+ i, d1, ip, d2, 0.L, d1);
+ ATF_CHECK_EQ_MSG(ip, 0,
+ "[%d] modfl(%La) returned int %La, frac %La;"
+ " expected int %La, frac %La",
+ i, d1, ip, d2, 0.L, d1);
f = frexpl(d1, &e);
- ATF_REQUIRE_EQ(e, LDBL_MIN_EXP - i);
- ATF_REQUIRE_EQ(f, 0.5);
+ ATF_CHECK_EQ_MSG(e, LDBL_MIN_EXP - i,
+ "[%d] frexpl(%La) returned normalized %La, exponent %d;"
+ " expected normalized %La, exponent %d",
+ i, d1, f, e, 0.5L, LDBL_MIN_EXP - i);
+ ATF_CHECK_EQ_MSG(f, 0.5,
+ "[%d] frexpl(%La) returned normalized %La, exponent %d;"
+ " expected normalized %La, exponent %d",
+ i, d1, f, e, 0.5L, LDBL_MIN_EXP - i);
}
+#endif
d1 /= 2;
- ATF_REQUIRE_EQ(fpclassify(d1), FP_ZERO);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(iszero(d1), "d1=%La", d1);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(d1), FP_ZERO,
+ "fpclassify(%La)=%d FP_ZERO=%d",
+ d1, fpclassify(d1), FP_ZERO);
+ CHECKEXCEPT();
f = frexpl(d1, &e);
- ATF_REQUIRE_EQ(e, 0);
- ATF_REQUIRE_EQ(f, 0);
+ ATF_CHECK_EQ_MSG(e, 0,
+ "frexpl(%La) returned normalized %La, exponent %d;"
+ " expected normalized %La, exponent %d",
+ d1, f, e, 0.L, 0);
+ ATF_CHECK_EQ_MSG(f, 0,
+ "frexpl(%La) returned normalized %La, exponent %d;"
+ " expected normalized %La, exponent %d",
+ d1, f, e, 0.L, 0);
+
+ if (isinf((long double)INFINITY)) {
+ volatile long double inf = INFINITY;
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(inf), "inf=%La", inf);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(inf), "inf=%La", inf);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isinf(inf), "inf=%La", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(inf), "inf=%La", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(inf), "inf=%La", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(inf), "inf=%La", inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(inf), FP_INFINITE,
+ "fpclassify(%La)=%d FP_INFINITE=%d",
+ inf, fpclassify(inf), FP_INFINITE);
+ CHECKEXCEPT();
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnan(-inf), "-inf=%La", -inf);
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(-inf), "-inf=%La", -inf);
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isinf(-inf), "-inf=%La", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(-inf), "-inf=%La", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(-inf), "-inf=%La", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(-inf), "-inf=%La", -inf);
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(-inf), FP_INFINITE,
+ "fpclassify(%La)=%d FP_INFINITE=%d",
+ -inf, fpclassify(-inf), FP_INFINITE);
+ CHECKEXCEPT();
+ } else {
+#ifdef _FLOAT_IEEE754
+ atf_tc_fail_nonfatal("isinf((long double)INFINITY=%La) failed",
+ (long double)INFINITY);
+#endif
+ }
+
+#ifdef NAN
+ {
+ volatile long double nan = NAN;
+
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ (void)issignalling(nan); /* could be quiet or signalling */
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%La [0x%s]", nan,
+ formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%La [0x%s])=%d FP_NAN=%d",
+ nan, formatbitsl(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+#ifdef _FLOAT_IEEE754
+#ifdef __HAVE_LONG_DOUBLE
+ /* test a quiet NaN */
+ nan = makequietsignallingl(NAN, LDBL_QNANBITH);
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issignalling(nan), "nan=%La [0x%s]", nan,
+ formatbitsl(nan));
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%La [0x%s]", nan,
+ formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%La [0x%s])=%d FP_NAN=%d",
+ nan, formatbitsl(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+ /* verify quiet NaN doesn't provoke exception */
+ CLEAREXCEPT();
+ volatile long double y = nan + nan;
+ (void)y;
+ CHECKEXCEPT();
+
+ /* test a signalling NaN */
+ nan = makequietsignallingl(NAN, LDBL_SNANBITH);
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(isnan(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+#ifdef HAVE_ISSIGNALLING
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(issignalling(nan), "nan=%La [0x%s]", nan,
+ formatbitsl(nan));
+ CHECKEXCEPT();
+#endif
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isinf(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!isnormal(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!issubnormal(nan), "nan=%La [0x%s]", nan,
+ formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_MSG(!iszero(nan), "nan=%La [0x%s]", nan, formatbitsl(nan));
+ CHECKEXCEPT();
+ CLEAREXCEPT();
+ ATF_CHECK_EQ_MSG(fpclassify(nan), FP_NAN,
+ "fpclassify(%La [0x%s])=%d FP_NAN=%d",
+ nan, formatbitsl(nan), fpclassify(nan), FP_NAN);
+ CHECKEXCEPT();
+
+ /* verify signalling NaN does provoke exception */
+ CLEAREXCEPT();
+#if defined __clang__ && defined SOFTFLOAT_LONG_DOUBLE
+ /*
+ * The softfloat implementation in compiler-rt used by clang
+ * builds has no floating-point exceptions, so any ports with
+ * softfloat long double ABI will fail this test.
+ */
+ atf_tc_expect_fail("PR lib/59853:"
+ " compiler-rt softfloat lacks floating-point exceptions");
+#endif
+ volatile long double z = nan + nan;
+ (void)z;
+ ATF_CHECK_MSG(fetestexcept(FE_INVALID),
+ "signalling NaN %La [0x%s] failed to raise invalid operation",
+ nan, formatbitsl(nan));
+#endif
+ }
+#endif
}
-#endif /* TEST_LONG_DOUBLE */
-#endif /* _FLOAT_IEEE754 */
ATF_TP_ADD_TCS(tp)
{
-#ifndef _FLOAT_IEEE754
- ATF_TP_ADD_TC(tp, no_test);
-#else
ATF_TP_ADD_TC(tp, fpclassify_float);
ATF_TP_ADD_TC(tp, fpclassify_double);
-#ifdef TEST_LONG_DOUBLE
ATF_TP_ADD_TC(tp, fpclassify_long_double);
-#endif /* TEST_LONG_DOUBLE */
-#endif /* _FLOAT_IEEE754 */
return atf_no_error();
}
diff --git a/lib/libc/gen/t_fpsetmask.c b/lib/libc/gen/t_fpsetmask.c
index d706bbdc1170..876d7a9ebb02 100644
--- a/lib/libc/gen/t_fpsetmask.c
+++ b/lib/libc/gen/t_fpsetmask.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fpsetmask.c,v 1.21 2020/08/23 11:04:58 gson Exp $ */
+/* $NetBSD: t_fpsetmask.c,v 1.22 2024/05/14 14:55:43 riastradh Exp $ */
/*-
* Copyright (c) 1995 The NetBSD Foundation, Inc.
@@ -61,16 +61,25 @@ ATF_TC_BODY(no_test, tc)
#if (__arm__ && !__SOFTFP__) || __aarch64__
/*
* Some NEON fpus do not trap on IEEE 754 FP exceptions.
- * skip these tests if running on them and compiled for
+ * Skip these tests if running on them and compiled for
* hard float.
*/
-#define FPU_PREREQ() \
- if (0 == fpsetmask(fpsetmask(FP_X_INV))) \
- atf_tc_skip("FPU does not implement traps on FP exceptions");
+#define FPU_PREREQ() do \
+{ \
+ if (0 == fpsetmask(fpsetmask(FP_X_INV))) \
+ atf_tc_skip("FPU does not implement traps on FP exceptions"); \
+} while (0)
+#endif
+
+#ifdef __riscv__
+#ifdef __riscv__
+#define FPU_PREREQ() \
+ atf_tc_skip("RISC-V does not support floating-point exception traps")
+#endif
#endif
#ifndef FPU_PREREQ
-#define FPU_PREREQ() /* nothing */
+#define FPU_PREREQ() __nothing
#endif
void sigfpe(int, siginfo_t *, void *);
diff --git a/lib/libc/gen/t_fpsetround.c b/lib/libc/gen/t_fpsetround.c
index 0f23e74e57c8..4f080a3db823 100644
--- a/lib/libc/gen/t_fpsetround.c
+++ b/lib/libc/gen/t_fpsetround.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fpsetround.c,v 1.6 2011/10/01 17:46:10 christos Exp $ */
+/* $NetBSD: t_fpsetround.c,v 1.8 2024/10/29 20:04:30 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fpsetround.c,v 1.6 2011/10/01 17:46:10 christos Exp $");
+__RCSID("$NetBSD: t_fpsetround.c,v 1.8 2024/10/29 20:04:30 riastradh Exp $");
#include <float.h>
#include <math.h>
@@ -154,10 +154,51 @@ ATF_TC_BODY(fpsetround_basic, tc)
#endif /* _FLOAT_IEEE754 */
}
+ATF_TC(fpsetround_noftz);
+ATF_TC_HEAD(fpsetround_noftz, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Test fpsetround(3) does not toggle flush-to-zero mode");
+}
+ATF_TC_BODY(fpsetround_noftz, tc)
+{
+#if !defined(_FLOAT_IEEE754) || !defined(__DBL_DENORM_MIN__)
+ atf_tc_skip("no fpsetround or subnormals");
+#else
+ volatile double x = DBL_MIN;
+ volatile double y;
+ int r;
+
+ y = x/2;
+ ATF_CHECK_MSG(y != 0, "machine runs flush-to-zero by default");
+
+ /*
+ * This curious test is a regression test for:
+ *
+ * PR port-arm/58782: fpsetround flips all the other fpcsr bits
+ * on aarch64
+ */
+
+ ATF_CHECK_EQ_MSG((r = fpsetround(FP_RN)), FP_RN,
+ "r=%d FP_RN=%d", r, FP_RN);
+ y = x/2;
+ ATF_CHECK_MSG(y != 0,
+ "machine runs flush-to-zero after one fpsetround call");
+
+ ATF_CHECK_EQ_MSG((r = fpsetround(FP_RN)), FP_RN,
+ "r=%d FP_RN=%d", r, FP_RN);
+ y = x/2;
+ ATF_CHECK_MSG(y != 0,
+ "machine runs flush-to-zero after two fpsetround calls");
+#endif
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, fpsetround_basic);
+ ATF_TP_ADD_TC(tp, fpsetround_noftz);
return atf_no_error();
}
diff --git a/lib/libc/gen/t_isnan.c b/lib/libc/gen/t_isnan.c
index 2871e314066e..e9d5dc8b7f74 100644
--- a/lib/libc/gen/t_isnan.c
+++ b/lib/libc/gen/t_isnan.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_isnan.c,v 1.5 2014/11/04 00:20:19 justin Exp $ */
+/* $NetBSD: t_isnan.c,v 1.6 2025/04/07 01:54:22 riastradh Exp $ */
/*
* This file is in the Public Domain.
@@ -22,16 +22,13 @@ ATF_TC_HEAD(isnan_basic, tc)
ATF_TC_BODY(isnan_basic, tc)
{
-#if defined(__m68k__)
- atf_tc_skip("Test not applicable on " MACHINE_ARCH);
-#endif
#ifdef NAN
/* NAN is meant to be a (float)NaN. */
ATF_CHECK(isnan(NAN) != 0);
ATF_CHECK(isnan((double)NAN) != 0);
#else
- atf_tc_skip("Test not applicable");
+ atf_tc_skip("No NaN on this architecture");
#endif
}
@@ -43,8 +40,8 @@ ATF_TC_HEAD(isinf_basic, tc)
ATF_TC_BODY(isinf_basic, tc)
{
-#if defined(__m68k__)
- atf_tc_skip("Test not applicable on " MACHINE_ARCH);
+#ifdef __vax__
+ atf_tc_skip("No infinity on this architecture");
#endif
/* HUGE_VAL is meant to be an infinity. */
diff --git a/lib/libc/gen/t_siginfo.c b/lib/libc/gen/t_siginfo.c
index 1057d28433e4..3f7ed7a6e996 100644
--- a/lib/libc/gen/t_siginfo.c
+++ b/lib/libc/gen/t_siginfo.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_siginfo.c,v 1.49 2023/08/04 03:31:13 rin Exp $ */
+/* $NetBSD: t_siginfo.c,v 1.55 2024/09/04 03:33:29 rin Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -306,7 +306,7 @@ ATF_TC_HEAD(sigfpe_flt, tc)
ATF_TC_BODY(sigfpe_flt, tc)
{
struct sigaction sa;
- double d = strtod("0", NULL);
+ volatile double d = strtod("0", NULL);
if (isQEMU())
atf_tc_skip("Test does not run correctly under QEMU");
@@ -318,6 +318,8 @@ ATF_TC_BODY(sigfpe_flt, tc)
*/
if (0 == fpsetmask(fpsetmask(FP_X_INV)))
atf_tc_skip("FPU does not implement traps on FP exceptions");
+#elif defined __riscv__
+ atf_tc_skip("RISC-V does not support floating-point exception traps");
#endif
if (sigsetjmp(sigfpe_flt_env, 0) == 0) {
sa.sa_flags = SA_SIGINFO;
@@ -366,7 +368,8 @@ ATF_TC_BODY(sigfpe_int, tc)
{
struct sigaction sa;
-#if defined(__aarch64__) || defined(__powerpc__) || defined(__sh3__)
+#if defined(__aarch64__) || defined(__powerpc__) || defined(__sh3__) || \
+ defined(__riscv__)
atf_tc_skip("Integer division by zero doesn't trap");
#endif
if (sigsetjmp(sigfpe_int_env, 0) == 0) {
@@ -383,7 +386,7 @@ ATF_TC_BODY(sigfpe_int, tc)
* Do not use constant 1 here. GCC >= 12 optimizes
* (1 / i) to (abs(i) == 1 ? i : 0), even for -O0.
*/
- long unity = strtol("1", NULL, 10),
+ volatile long unity = strtol("1", NULL, 10),
zero = strtol("0", NULL, 10);
printf("%ld\n", unity / zero);
}
@@ -439,8 +442,9 @@ sigbus_action(int signo, siginfo_t *info, void *ptr)
ATF_REQUIRE_EQ(info->si_code, BUS_ADRALN);
#if defined(__i386__) || defined(__x86_64__)
- atf_tc_expect_fail("x86 architecture does not correctly "
- "report the address where the unaligned access occurred");
+ atf_tc_skip("Data address is not provided for "
+ "x86 alignment check exception, and NetBSD/x86 reports "
+ "faulting PC instead");
#endif
ATF_REQUIRE_EQ(info->si_addr, (volatile void *)addr);
@@ -483,7 +487,8 @@ ATF_TC_BODY(sigbus_adraln, tc)
* same for armv8 or newer */
#if (defined(__m68k__) && !defined(__mc68010__)) || \
defined(__aarch64__) || \
- defined(__riscv__)
+ defined(__riscv__) || \
+ defined(__vax__)
atf_tc_skip("No SIGBUS signal for unaligned accesses");
#endif
diff --git a/lib/libc/gen/t_sleep.c b/lib/libc/gen/t_sleep.c
index 4545a6941a76..ee69dcee9936 100644
--- a/lib/libc/gen/t_sleep.c
+++ b/lib/libc/gen/t_sleep.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sleep.c,v 1.11 2017/01/10 15:43:59 maya Exp $ */
+/* $NetBSD: t_sleep.c,v 1.14 2025/04/08 01:29:08 riastradh Exp $ */
/*-
* Copyright (c) 2006 Frank Kardel
@@ -165,10 +165,14 @@ do_kevent(struct timespec *delay, struct timespec *remain)
tmo/1000 < delay->tv_sec && tmo/500 > delay->tv_sec)
delay->tv_sec = MAXSLEEP;
+ fprintf(stderr, "kevent: set EVFILT_TIMER tmo=%d\n", tmo);
EV_SET(&ktimer, 1, EVFILT_TIMER, EV_ADD, 0, tmo, 0);
+ fprintf(stderr, "kevent: wait up to %lld.%09ld sec\n",
+ (long long)delay->tv_sec, (long)delay->tv_nsec);
rtc = kevent(kq, &ktimer, 1, &kresult, 1, delay);
kerrno = errno;
+ fprintf(stderr, "kevent returned rtc=%d\n", rtc);
(void)close(kq);
@@ -179,19 +183,19 @@ do_kevent(struct timespec *delay, struct timespec *remain)
}
if (delay->tv_sec * BILLION + delay->tv_nsec > tmo * MILLION)
- ATF_REQUIRE_MSG(rtc > 0,
+ ATF_CHECK_MSG(rtc > 0,
"kevent: KEVNT_TIMEOUT did not cause EVFILT_TIMER event");
return 0;
}
ATF_TC(nanosleep);
-ATF_TC_HEAD(nanosleep, tc)
+ATF_TC_HEAD(nanosleep, tc)
{
-
+
atf_tc_set_md_var(tc, "descr", "Test nanosleep(2) timing");
atf_tc_set_md_var(tc, "timeout", "65");
-}
+}
ATF_TC_BODY(nanosleep, tc)
{
@@ -200,12 +204,12 @@ ATF_TC_BODY(nanosleep, tc)
}
ATF_TC(select);
-ATF_TC_HEAD(select, tc)
+ATF_TC_HEAD(select, tc)
{
-
+
atf_tc_set_md_var(tc, "descr", "Test select(2) timing");
atf_tc_set_md_var(tc, "timeout", "65");
-}
+}
ATF_TC_BODY(select, tc)
{
@@ -214,12 +218,12 @@ ATF_TC_BODY(select, tc)
}
ATF_TC(poll);
-ATF_TC_HEAD(poll, tc)
+ATF_TC_HEAD(poll, tc)
{
-
+
atf_tc_set_md_var(tc, "descr", "Test poll(2) timing");
atf_tc_set_md_var(tc, "timeout", "65");
-}
+}
ATF_TC_BODY(poll, tc)
{
@@ -228,12 +232,12 @@ ATF_TC_BODY(poll, tc)
}
ATF_TC(sleep);
-ATF_TC_HEAD(sleep, tc)
+ATF_TC_HEAD(sleep, tc)
{
-
+
atf_tc_set_md_var(tc, "descr", "Test sleep(3) timing");
atf_tc_set_md_var(tc, "timeout", "65");
-}
+}
ATF_TC_BODY(sleep, tc)
{
@@ -242,12 +246,12 @@ ATF_TC_BODY(sleep, tc)
}
ATF_TC(kevent);
-ATF_TC_HEAD(kevent, tc)
+ATF_TC_HEAD(kevent, tc)
{
-
+
atf_tc_set_md_var(tc, "descr", "Test kevent(2) timing");
atf_tc_set_md_var(tc, "timeout", "65");
-}
+}
ATF_TC_BODY(kevent, tc)
{
@@ -272,39 +276,66 @@ sleeptest(int (*test)(struct timespec *, struct timespec *),
round = 1000000000;
delta3 = round;
}
+ fprintf(stderr, "round=%"PRId64" delta3=%"PRId64"\n", round, delta3);
tslp.tv_sec = delta3 / 1000000000;
tslp.tv_nsec = delta3 % 1000000000;
+ fprintf(stderr, "initial tslp = %lld.%09ld sec\n",
+ (long long)tslp.tv_sec, (long)tslp.tv_nsec);
while (tslp.tv_sec <= MAXSLEEP) {
+ fprintf(stderr, "\n");
+
/*
* disturb sleep by signal on purpose
- */
- if (tslp.tv_sec > ALARM && sig == 0)
+ */
+ if (tslp.tv_sec > ALARM && sig == 0) {
+ fprintf(stderr, "request alarm after %d sec\n", ALARM);
alarm(ALARM);
+ }
+
+ fprintf(stderr, "sleep for %lld.%09ld sec\n",
+ (long long)tslp.tv_sec, (long)tslp.tv_nsec);
clock_gettime(CLOCK_REALTIME, &tsa);
(*test)(&tslp, &tremain);
clock_gettime(CLOCK_REALTIME, &tsb);
+ fprintf(stderr, "slept from %lld.%09ld to %lld.%09ld\n",
+ (long long)tsa.tv_sec, (long)tsa.tv_nsec,
+ (long long)tsb.tv_sec, (long)tsb.tv_nsec);
+
if (sim_remain) {
timespecsub(&tsb, &tsa, &tremain);
+ fprintf(stderr, "slept %lld.%09ld sec\n",
+ (long long)tremain.tv_sec, (long)tremain.tv_nsec);
timespecsub(&tslp, &tremain, &tremain);
}
+ fprintf(stderr, "remaining %lld.%09ld sec\n",
+ (long long)tremain.tv_sec, (long)tremain.tv_nsec);
+
delta1 = (int64_t)tsb.tv_sec - (int64_t)tsa.tv_sec;
delta1 *= BILLION;
delta1 += (int64_t)tsb.tv_nsec - (int64_t)tsa.tv_nsec;
+ fprintf(stderr, "delta1=%"PRId64"\n", delta1);
+
delta2 = (int64_t)tremain.tv_sec * BILLION;
delta2 += (int64_t)tremain.tv_nsec;
+ fprintf(stderr, "delta2=%"PRId64"\n", delta2);
+
delta3 = (int64_t)tslp.tv_sec * BILLION;
delta3 += (int64_t)tslp.tv_nsec - delta1 - delta2;
+ fprintf(stderr, "delta3=%"PRId64"\n", delta3);
+
delta3 /= round;
delta3 *= round;
+ fprintf(stderr, " ->%"PRId64"\n", delta3);
+
if (delta3 > FUZZ || delta3 < -FUZZ) {
if (!sim_remain)
atf_tc_expect_fail("Long reschedule latency "
@@ -316,25 +347,30 @@ sleeptest(int (*test)(struct timespec *, struct timespec *),
delta3 = (int64_t)tslp.tv_sec * 2 * BILLION;
delta3 += (int64_t)tslp.tv_nsec * 2;
+ fprintf(stderr, "delta3=%"PRId64"\n", delta3);
+
delta3 /= round;
delta3 *= round;
+ fprintf(stderr, " ->%"PRId64"\n", delta3);
if (delta3 < FUZZ)
break;
tslp.tv_sec = delta3 / BILLION;
tslp.tv_nsec = delta3 % BILLION;
+ fprintf(stderr, "tslp = %lld.%ld sec\n",
+ (long long)tslp.tv_sec, (long)tslp.tv_nsec);
}
ATF_REQUIRE_MSG(sig == 1, "Alarm did not fire!");
atf_tc_pass();
}
-ATF_TP_ADD_TCS(tp)
+ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, nanosleep);
ATF_TP_ADD_TC(tp, select);
- ATF_TP_ADD_TC(tp, poll);
+ ATF_TP_ADD_TC(tp, poll);
ATF_TP_ADD_TC(tp, sleep);
ATF_TP_ADD_TC(tp, kevent);
-
+
return atf_no_error();
}
diff --git a/lib/libc/hash/Makefile b/lib/libc/hash/Makefile
index 86979a670ca2..5011df1855bd 100644
--- a/lib/libc/hash/Makefile
+++ b/lib/libc/hash/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.4 2017/05/21 15:28:42 riastradh Exp $
+# $NetBSD: Makefile,v 1.6 2025/10/19 01:00:00 riastradh Exp $
.include <bsd.own.mk>
diff --git a/lib/libc/kevent_nullmnt/t_nullmnt.sh b/lib/libc/kevent_nullmnt/t_nullmnt.sh
index 0f1cdada4352..ee658cdabceb 100644
--- a/lib/libc/kevent_nullmnt/t_nullmnt.sh
+++ b/lib/libc/kevent_nullmnt/t_nullmnt.sh
@@ -3,15 +3,33 @@
curdir=$(pwd)
helper=$(atf_get_srcdir)/h_nullmnt
+# helper function to check for kernel support
+have_nullfs_support()
+{
+ for t in $( sysctl -n vfs.generic.fstypes )
+ do
+ case "$t" in
+ null) return 0;;
+ esac
+ done
+
+ return 1
+}
+
# common test body
# $1 = directory of file to monitor
# $2 = directory of file to update/modify
nullmnt_common()
-{
+{
+ if ! have_nullfs_support; then
+ atf_skip "nullfs not supported"
+ fi
+
mkdir ${curdir}/lower_dir
mkdir ${curdir}/upper_dir
- mount -t null ${curdir}/lower_dir ${curdir}/upper_dir
+ mount -t null ${curdir}/lower_dir ${curdir}/upper_dir || \
+ atf_fail "could not mount nullfs"
rm -f ${curdir}/lower_dir/afile
touch ${curdir}/lower_dir/afile
diff --git a/lib/libc/locale/Makefile b/lib/libc/locale/Makefile
index 682a954e8155..3beb66f5cd0d 100644
--- a/lib/libc/locale/Makefile
+++ b/lib/libc/locale/Makefile
@@ -1,31 +1,39 @@
-# $NetBSD: Makefile,v 1.13 2019/07/28 13:46:45 christos Exp $
+# $NetBSD: Makefile,v 1.18 2024/08/15 21:19:45 riastradh Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/lib/libc/locale
+TESTS_C+= t_btowc
+TESTS_C+= t_c16rtomb
+TESTS_C+= t_c32rtomb
+TESTS_C+= t_c8rtomb
+TESTS_C+= t_digittoint
+TESTS_C+= t_ducet
+TESTS_C+= t_io
+TESTS_C+= t_mbrtoc16
+TESTS_C+= t_mbrtoc32
+TESTS_C+= t_mbrtoc8
TESTS_C+= t_mbrtowc
-TESTS_C+= t_mbstowcs
TESTS_C+= t_mbsnrtowcs
+TESTS_C+= t_mbstowcs
TESTS_C+= t_mbtowc
+TESTS_C+= t_sprintf
+TESTS_C+= t_strfmon
+TESTS_C+= t_toupper
+TESTS_C+= t_uchar
+TESTS_C+= t_wcscoll
TESTS_C+= t_wcscspn
TESTS_C+= t_wcspbrk
TESTS_C+= t_wcsrtombs
TESTS_C+= t_wcsspn
TESTS_C+= t_wcstod
TESTS_C+= t_wctomb
-TESTS_C+= t_io
-TESTS_C+= t_toupper
-TESTS_C+= t_digittoint
-TESTS_C+= t_sprintf
TESTS_C+= t_wctype
-TESTS_C+= t_btowc
-TESTS_C+= t_wcscoll
-TESTS_C+= t_ducet
-TESTS_C+= t_strfmon
-COPTS.t_wctomb.c += -Wno-stack-protector
-COPTS.t_digittoint.c += -Wno-unused-variable
COPTS.t_btowc.c += -Wno-unused-variable
+COPTS.t_digittoint.c += -Wno-unused-variable
+COPTS.t_strfmon.c += -Wno-format-nonliteral
+COPTS.t_wctomb.c += -Wno-stack-protector
.include <bsd.test.mk>
diff --git a/lib/libc/locale/t_strfmon.c b/lib/libc/locale/t_strfmon.c
index 194c6afd014b..f789db4cc26b 100644
--- a/lib/libc/locale/t_strfmon.c
+++ b/lib/libc/locale/t_strfmon.c
@@ -1,7 +1,8 @@
-/* $NetBSD: t_strfmon.c,v 1.3 2021/08/02 17:41:07 andvar Exp $ */
+/* $NetBSD: t_strfmon.c,v 1.6 2023/11/27 19:45:36 christos Exp $ */
/*-
* Copyright (c) 2017 The NetBSD Foundation, Inc.
+ * Copyright (C) 2018 Conrad Meyer <cem@FreeBSD.org>
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -30,27 +31,28 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_strfmon.c,v 1.3 2021/08/02 17:41:07 andvar Exp $");
+__RCSID("$NetBSD: t_strfmon.c,v 1.6 2023/11/27 19:45:36 christos Exp $");
#include <atf-c.h>
+#include <stdio.h>
#include <locale.h>
#include <monetary.h>
-ATF_TC(strfmon);
+ATF_TC(strfmon_locale);
-ATF_TC_HEAD(strfmon, tc)
+ATF_TC_HEAD(strfmon_locale, tc)
{
atf_tc_set_md_var(tc, "descr",
"Checks strfmon_l under different locales");
}
-ATF_TC_BODY(strfmon, tc)
+ATF_TC_BODY(strfmon_locale, tc)
{
const struct {
const char *locale;
const char *expected;
} tests[] = {
- { "C", "[ **1234.57] [ **1234.57]" },
+ { "C", "[ **1234.57 ] [ **1234.57 ]" },
{ "de_DE.UTF-8", "[ **1234,57 €] [ **1.234,57 EUR]" },
{ "en_GB.UTF-8", "[ £**1234.57] [ GBP**1,234.57]" },
};
@@ -67,10 +69,230 @@ ATF_TC_BODY(strfmon, tc)
}
}
+ATF_TC(strfmon_pad);
+
+ATF_TC_HEAD(strfmon_pad, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Checks strfmon padding");
+}
+
+ATF_TC_BODY(strfmon_pad, tc)
+{
+ char string[1024];
+
+ ATF_REQUIRE(setlocale(LC_MONETARY, "en_US.UTF-8") != NULL);
+ strfmon(string, sizeof(string), "[%8n] [%8n]", 123.45, 123.45);
+ ATF_REQUIRE_STREQ(string, "[ $123.45] [ $123.45]");
+}
+
+ATF_TC(strfmon_locale_thousands);
+
+ATF_TC_HEAD(strfmon_locale_thousands, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks strfmon locale thousands separator");
+}
+
+ATF_TC_BODY(strfmon_locale_thousands, tc)
+{
+ char actual[40], expected[40];
+ struct lconv *lc;
+ const char *ts;
+ double n;
+
+ setlocale(LC_MONETARY, "sv_SE.UTF-8");
+
+ lc = localeconv();
+
+ ts = lc->mon_thousands_sep;
+ if (strlen(ts) == 0)
+ ts = lc->thousands_sep;
+
+ if (strlen(ts) < 2)
+ atf_tc_skip("multi-byte thousands-separator not found");
+
+ n = 1234.56;
+ strfmon(actual, sizeof(actual) - 1, "%i", n);
+
+ strcpy(expected, "1");
+ strlcat(expected, ts, sizeof(expected));
+ strlcat(expected, "234", sizeof(expected));
+
+ /* We're just testing the thousands separator, not all of strfmon. */
+ actual[strlen(expected)] = '\0';
+ ATF_CHECK_STREQ(expected, actual);
+}
+
+ATF_TC(strfmon_examples);
+ATF_TC_HEAD(strfmon_examples, tc) {
+ atf_tc_set_md_var(tc, "descr",
+ "Checks strfmon field formats");
+}
+
+ATF_TC_BODY(strfmon_examples, tc)
+{
+ const struct {
+ const char *format;
+ const char *expected;
+ } tests[] = {
+ { "%n", "[$123.45] [-$123.45] [$3,456.78]" },
+ { "%11n", "[ $123.45] [ -$123.45] [ $3,456.78]" },
+ { "%#5n", "[ $ 123.45] [-$ 123.45] [ $ 3,456.78]" },
+ { "%=*#5n", "[ $***123.45] [-$***123.45] [ $*3,456.78]" },
+ { "%=0#5n", "[ $000123.45] [-$000123.45] [ $03,456.78]" },
+ { "%^#5n", "[ $ 123.45] [-$ 123.45] [ $ 3456.78]" },
+ { "%^#5.0n", "[ $ 123] [-$ 123] [ $ 3457]" },
+ { "%^#5.4n", "[ $ 123.4500] [-$ 123.4500] [ $ 3456.7810]" },
+ { "%(#5n", "[ $ 123.45 ] [($ 123.45)] [ $ 3,456.78 ]" },
+ { "%!(#5n", "[ 123.45 ] [( 123.45)] [ 3,456.78 ]" },
+ { "%-14#5.4n", "[ $ 123.4500 ] [-$ 123.4500 ] [ $ 3,456.7810 ]" },
+ { "%14#5.4n", "[ $ 123.4500] [ -$ 123.4500] [ $ 3,456.7810]" },
+ };
+ size_t i;
+ char actual[100], format[50];
+
+ if (setlocale(LC_MONETARY, "en_US.UTF-8") == NULL)
+ atf_tc_skip("unable to setlocale()");
+
+ for (i = 0; i < __arraycount(tests); ++i) {
+ snprintf(format, sizeof(format), "[%s] [%s] [%s]",
+ tests[i].format, tests[i].format, tests[i].format);
+ strfmon(actual, sizeof(actual) - 1, format,
+ 123.45, -123.45, 3456.781);
+ ATF_CHECK_STREQ_MSG(tests[i].expected, actual,
+ "[%s]", tests[i].format);
+ }
+}
+
+ATF_TC(strfmon_cs_precedes_0);
+
+ATF_TC_HEAD(strfmon_cs_precedes_0, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "sep_by_space x sign_posn when cs_precedes = 0");
+}
+
+ATF_TC_BODY(strfmon_cs_precedes_0, tc)
+{
+ const struct {
+ const char *expected;
+ } tests[] = {
+ /* sep_by_space x sign_posn */
+ { "[(123.00$)] [-123.00$] [123.00$-] [123.00-$] [123.00$-]" },
+ { "[(123.00 $)] [-123.00 $] [123.00 $-] [123.00 -$] [123.00 $-]" },
+ { "[(123.00$)] [- 123.00$] [123.00$ -] [123.00- $] [123.00$ -]" },
+ };
+ size_t i, j;
+ struct lconv *lc;
+ char actual[100], buf[100];
+
+ if (setlocale(LC_MONETARY, "en_US.UTF-8") == NULL)
+ atf_tc_skip("unable to setlocale()");
+
+ lc = localeconv();
+ lc->n_cs_precedes = 0;
+
+ for (i = 0; i < __arraycount(tests); ++i) {
+ actual[0] = '\0';
+ lc->n_sep_by_space = i;
+
+ for (j = 0; j < 5; ++j) {
+ lc->n_sign_posn = j;
+
+ strfmon(buf, sizeof(buf) - 1, "[%n] ", -123.0);
+ strlcat(actual, buf, sizeof(actual));
+ }
+
+ actual[strlen(actual) - 1] = '\0';
+ ATF_CHECK_STREQ_MSG(tests[i].expected, actual,
+ "sep_by_space = %zu", i);
+ }
+}
+
+ATF_TC(strfmon_cs_precedes_1);
+
+ATF_TC_HEAD(strfmon_cs_precedes_1, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "sep_by_space x sign_posn when cs_precedes = 1");
+}
+
+ATF_TC_BODY(strfmon_cs_precedes_1, tc)
+{
+ const struct {
+ const char *expected;
+ } tests[] = {
+ /* sep_by_space x sign_posn */
+ { "[($123.00)] [-$123.00] [$123.00-] [-$123.00] [$-123.00]" },
+ { "[($ 123.00)] [-$ 123.00] [$ 123.00-] [-$ 123.00] [$- 123.00]" },
+ { "[($123.00)] [- $123.00] [$123.00 -] [- $123.00] [$ -123.00]" },
+ };
+ size_t i, j;
+ struct lconv *lc;
+ char actual[100], buf[100];
+
+ if (setlocale(LC_MONETARY, "en_US.UTF-8") == NULL)
+ atf_tc_skip("unable to setlocale()");
+
+ lc = localeconv();
+ lc->n_cs_precedes = 1;
+
+ for (i = 0; i < __arraycount(tests); ++i) {
+ actual[0] = '\0';
+ lc->n_sep_by_space = i;
+
+ for (j = 0; j < 5; ++j) {
+ lc->n_sign_posn = j;
+
+ strfmon(buf, sizeof(buf) - 1, "[%n] ", -123.0);
+ strlcat(actual, buf, sizeof(actual));
+ }
+
+ actual[strlen(actual) - 1] = '\0';
+ ATF_CHECK_STREQ_MSG(tests[i].expected, actual,
+ "sep_by_space = %zu", i);
+ }
+}
+
+ATF_TC(strfmon_international_currency_code);
+ATF_TC_HEAD(strfmon_international_currency_code, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "checks strfmon international currency code");
+}
+
+ATF_TC_BODY(strfmon_international_currency_code, tc)
+{
+ const struct {
+ const char *locale;
+ const char *expected;
+ } tests[] = {
+ { "en_US.UTF-8", "[USD123.45]" },
+ { "de_DE.UTF-8", "[123,45 EUR]" },
+ { "C", "[123.45]" },
+ };
+ size_t i;
+ char actual[100];
+
+ for (i = 0; i < __arraycount(tests); ++i) {
+ if (setlocale(LC_MONETARY, tests[i].locale) == NULL)
+ atf_tc_skip("unable to setlocale()");
+
+ strfmon(actual, sizeof(actual) - 1, "[%i]", 123.45);
+ ATF_CHECK_STREQ(tests[i].expected, actual);
+ }
+}
+
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, strfmon);
+ ATF_TP_ADD_TC(tp, strfmon_locale);
+ ATF_TP_ADD_TC(tp, strfmon_pad);
+ ATF_TP_ADD_TC(tp, strfmon_locale_thousands);
+ ATF_TP_ADD_TC(tp, strfmon_examples);
+ ATF_TP_ADD_TC(tp, strfmon_cs_precedes_0);
+ ATF_TP_ADD_TC(tp, strfmon_cs_precedes_1);
+ ATF_TP_ADD_TC(tp, strfmon_international_currency_code);
return atf_no_error();
}
diff --git a/lib/libc/membar/t_spinlock.c b/lib/libc/membar/t_spinlock.c
index d7ebdbd83ee5..28e369cd4004 100644
--- a/lib/libc/membar/t_spinlock.c
+++ b/lib/libc/membar/t_spinlock.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_spinlock.c,v 1.4 2022/08/12 11:21:44 riastradh Exp $ */
+/* $NetBSD: t_spinlock.c,v 1.6 2026/01/04 11:48:02 jmcneill Exp $ */
/*-
* Copyright (c) 2022 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_spinlock.c,v 1.4 2022/08/12 11:21:44 riastradh Exp $");
+__RCSID("$NetBSD: t_spinlock.c,v 1.6 2026/01/04 11:48:02 jmcneill Exp $");
#include <sys/types.h>
diff --git a/lib/libc/misc/Makefile b/lib/libc/misc/Makefile
index 4846dac455d1..2987e20090da 100644
--- a/lib/libc/misc/Makefile
+++ b/lib/libc/misc/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.9 2023/08/10 20:44:37 mrg Exp $
+# $NetBSD: Makefile,v 1.13 2025/11/21 20:57:22 nia Exp $
.include <bsd.own.mk>
@@ -7,6 +7,15 @@ TESTSDIR= ${TESTSBASE}/lib/libc/misc
TESTS_C+= t_ubsan
TESTS_CXX+= t_ubsanxx
+.if ${MACHINE_ARCH} == "sparc64"
+TESTS_C+= t_vis
+.if ${ACTIVE_CC} == "gcc"
+COPTS.t_vis.c+= -mvis
+.elif ${ACTIVE_CC} == "clang"
+COPTS.t_vis.c+= -no-integrated-as -Xassembler -Av9a
+.endif
+.endif
+
.PATH: ${NETBSDSRCDIR}/common/lib/libc/misc
SRCS.t_ubsan= t_ubsan.c
SRCS.t_ubsanxx= t_ubsanxx.cpp
@@ -20,14 +29,12 @@ SRCS.t_ubsanxx+= ubsan.c
UBSAN_FLAGS= -fsanitize=undefined
UBSAN_FLAGS+= ${${ACTIVE_CC} == "clang" :? -fsanitize=integer :}
UBSAN_FLAGS+= ${${ACTIVE_CC} == "clang" :? -fsanitize=nullability :}
-CFLAGS+= ${UBSAN_FLAGS}
-CXXFLAGS+= ${UBSAN_FLAGS}
CWARNFLAGS+= -Wno-return-type -Wno-strict-aliasing
CWARNFLAGS.clang+= -Wno-incompatible-pointer-types-discards-qualifiers
CWARNFLAGS.clang+= -Wno-nullability-completeness
.endif
-COPTS.t_ubsan.c += -Wno-stack-protector
-COPTS.t_ubsanxx.cpp += -Wno-stack-protector
+COPTS.t_ubsan.c += -Wno-stack-protector ${UBSAN_FLAGS}
+COPTS.t_ubsanxx.cpp += -Wno-stack-protector ${UBSAN_FLAGS}
COPTS.ubsan.c+= ${${ACTIVE_CC} == "clang" && ${MACHINE_ARCH} == "powerpc":? -O0 :}
COPTS.t_ubsan.c+= ${${ACTIVE_CC} == "gcc" && ${HAVE_GCC:U0} >= 7:? -Wno-int-in-bool-context :}
diff --git a/lib/libc/regex/Makefile b/lib/libc/regex/Makefile
index 18fddffd5072..747841a23261 100644
--- a/lib/libc/regex/Makefile
+++ b/lib/libc/regex/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.11 2021/02/25 22:37:36 christos Exp $
+# $NetBSD: Makefile,v 1.13 2025/01/02 01:45:19 kre Exp $
NOMAN=
@@ -7,15 +7,24 @@ NOMAN=
TESTSDIR?= ${TESTSBASE}/lib/libc/regex
IMPLEMENTATION?= -DREGEX_SPENCER -DSKIP_LEFTASSOC
+LIBC= ${NETBSDSRCDIR}/lib/libc
BINDIR= ${TESTSDIR}
PROGS?= h_regex
SRCS.h_regex= main.c split.c debug.c
-CPPFLAGS+= -I${NETBSDSRCDIR}/lib/libc/regex ${IMPLEMENTATION} -DNLS
+CPPFLAGS+= -I${LIBC}/regex ${IMPLEMENTATION} -DNLS
TESTS_SH?= t_regex
TESTS_C= t_regex_att
+TESTS_C+= t_regex_binary
TESTS_C+= t_exhaust
+.PATH: ${LIBC}/regex
+REGEXSRCS = regcomp.c regerror.c regexec.c regsub.c
+SRCS.t_regex_binary= t_regex_binary.c ${REGEXSRCS}
+.for s in ${REGEXSRCS}
+CPPFLAGS.$s+= -UNLS -I${LIBC}/include
+.endfor
+
FILESDIR= ${TESTSDIR}/data
FILES+= README
FILES+= data/anchor.in
diff --git a/lib/libc/setjmp/Makefile b/lib/libc/setjmp/Makefile
index b87578f5fd9c..f574b3be0599 100644
--- a/lib/libc/setjmp/Makefile
+++ b/lib/libc/setjmp/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.2 2011/04/21 18:58:20 martin Exp $
+# $NetBSD: Makefile,v 1.3 2024/02/19 04:30:39 riastradh Exp $
NOMAN= # defined
@@ -9,6 +9,7 @@ WARNS= 4
TESTSDIR= ${TESTSBASE}/lib/libc/setjmp
TESTS_C+= t_setjmp
+TESTS_C+= t_sigstack
TESTS_C+= t_threadjmp
LDFLAGS.t_threadjmp+= -pthread
diff --git a/lib/libc/setjmp/t_setjmp.c b/lib/libc/setjmp/t_setjmp.c
index 82e73d07c4e2..1e7e1553fa33 100644
--- a/lib/libc/setjmp/t_setjmp.c
+++ b/lib/libc/setjmp/t_setjmp.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_setjmp.c,v 1.3 2021/03/21 16:36:32 christos Exp $ */
+/* $NetBSD: t_setjmp.c,v 1.13 2025/04/28 18:29:09 martin Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
/*
* Copyright (c) 1994 Christopher G. Demetriou
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -45,7 +45,7 @@
* information about NetBSD.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -56,17 +56,18 @@
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
+ *
* <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
*/
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_setjmp.c,v 1.3 2021/03/21 16:36:32 christos Exp $");
+__RCSID("$NetBSD: t_setjmp.c,v 1.13 2025/04/28 18:29:09 martin Exp $");
#include <sys/types.h>
+#include <dlfcn.h>
#include <errno.h>
#include <setjmp.h>
#include <signal.h>
@@ -78,14 +79,67 @@ __RCSID("$NetBSD: t_setjmp.c,v 1.3 2021/03/21 16:36:32 christos Exp $");
#include <atf-c.h>
-#define REQUIRE_ERRNO(x) ATF_REQUIRE_MSG(x, "%s", strerror(errno))
+#include "h_macros.h"
+
+enum test {
+ TEST_SETJMP,
+ TEST_U_SETJMP,
+ TEST_SIGSETJMP_SAVE,
+ TEST_SIGSETJMP_NOSAVE,
+ TEST_LONGJMP_ZERO,
+ TEST_U_LONGJMP_ZERO,
-#define TEST_SETJMP 0
-#define TEST_U_SETJMP 1
-#define TEST_SIGSETJMP_SAVE 2
-#define TEST_SIGSETJMP_NOSAVE 3
-#define TEST_LONGJMP_ZERO 4
-#define TEST_U_LONGJMP_ZERO 5
+ TEST_COMPAT13_SETJMP,
+ TEST_COMPAT13_SIGSETJMP_SAVE,
+ TEST_COMPAT13_SIGSETJMP_NOSAVE,
+ TEST_COMPAT13_LONGJMP_ZERO,
+};
+
+/*
+ * Optional compat13 functions from when sigcontext was expanded.
+ * Fortunately the only change visible to the caller is that the size
+ * of jmp_buf increased, so we can always use the old symbols with new
+ * jmp_buf arrays.
+ */
+int (*compat13_sigsetjmp)(sigjmp_buf, int);
+void (*compat13_siglongjmp)(sigjmp_buf, int);
+int (*compat13_setjmp)(jmp_buf);
+void (*compat13_longjmp)(jmp_buf, int);
+
+/*
+ * compatsigsys(signo)
+ *
+ * Signal handler for SIGSYS in case compat_13_sigreturn13 is not
+ * implemented by the kernel -- we will just skip the test in that
+ * case.
+ */
+static void
+compatsigsys(int signo)
+{
+
+ atf_tc_skip("no compat syscalls to test");
+}
+
+static void
+compatsetup(void)
+{
+
+ /*
+ * Grab the libc library symbols if available.
+ */
+ if ((compat13_sigsetjmp = dlsym(RTLD_SELF, "sigsetjmp")) == NULL ||
+ (compat13_siglongjmp = dlsym(RTLD_SELF, "siglongjmp")) == NULL ||
+ (compat13_setjmp = dlsym(RTLD_SELF, "setjmp")) == NULL ||
+ (compat13_longjmp = dlsym(RTLD_SELF, "longjmp")) == NULL)
+ atf_tc_skip("no compat functions to test");
+
+ /*
+ * Arrange for SIGSYS to skip the test -- this happens if the
+ * libc stub has the function, but the kernel isn't built with
+ * support for the compat13 sigreturn syscall for longjmp.
+ */
+ REQUIRE_LIBC(signal(SIGSYS, &compatsigsys), SIG_ERR);
+}
static int expectsignal;
@@ -97,7 +151,7 @@ aborthandler(int signo __unused)
}
static void
-h_check(int test)
+h_check(enum test test)
{
struct sigaction sa;
jmp_buf jb;
@@ -109,35 +163,79 @@ h_check(int test)
i = getpid();
did_longjmp = false;
- if (test == TEST_SETJMP || test == TEST_SIGSETJMP_SAVE ||
- test == TEST_LONGJMP_ZERO)
+ switch (test) {
+ case TEST_COMPAT13_SETJMP:
+ case TEST_COMPAT13_SIGSETJMP_SAVE:
+ case TEST_COMPAT13_LONGJMP_ZERO:
+ case TEST_COMPAT13_SIGSETJMP_NOSAVE:
+ compatsetup();
+ break;
+ default:
+ break;
+ }
+
+ switch (test) {
+ case TEST_SETJMP:
+ case TEST_SIGSETJMP_SAVE:
+ case TEST_LONGJMP_ZERO:
+ case TEST_COMPAT13_SETJMP:
+ case TEST_COMPAT13_SIGSETJMP_SAVE:
+ case TEST_COMPAT13_LONGJMP_ZERO:
expectsignal = 0;
- else if (test == TEST_U_SETJMP || test == TEST_SIGSETJMP_NOSAVE ||
- test == TEST_U_LONGJMP_ZERO)
+ break;
+ case TEST_U_SETJMP:
+ case TEST_SIGSETJMP_NOSAVE:
+ case TEST_U_LONGJMP_ZERO:
+ case TEST_COMPAT13_SIGSETJMP_NOSAVE:
expectsignal = 1;
- else
+ break;
+ default:
atf_tc_fail("unknown test");
+ }
sa.sa_handler = aborthandler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
- REQUIRE_ERRNO(sigaction(SIGABRT, &sa, NULL) != -1);
- REQUIRE_ERRNO(sigemptyset(&ss) != -1);
- REQUIRE_ERRNO(sigaddset(&ss, SIGABRT) != -1);
- REQUIRE_ERRNO(sigprocmask(SIG_BLOCK, &ss, NULL) != -1);
+ RL(sigaction(SIGABRT, &sa, NULL));
+ RL(sigemptyset(&ss));
+ RL(sigaddset(&ss, SIGABRT));
+ RL(sigprocmask(SIG_BLOCK, &ss, NULL));
- if (test == TEST_SETJMP || test == TEST_LONGJMP_ZERO)
+ switch (test) {
+ case TEST_SETJMP:
+ case TEST_LONGJMP_ZERO:
x = setjmp(jb);
- else if (test == TEST_U_SETJMP || test == TEST_U_LONGJMP_ZERO)
+ break;
+ case TEST_COMPAT13_SETJMP:
+ case TEST_COMPAT13_LONGJMP_ZERO:
+ x = (*compat13_setjmp)(jb);
+ break;
+ case TEST_U_SETJMP:
+ case TEST_U_LONGJMP_ZERO:
x = _setjmp(jb);
- else
+ break;
+ case TEST_SIGSETJMP_SAVE:
+ case TEST_SIGSETJMP_NOSAVE:
x = sigsetjmp(sjb, !expectsignal);
+ break;
+ case TEST_COMPAT13_SIGSETJMP_SAVE:
+ case TEST_COMPAT13_SIGSETJMP_NOSAVE:
+ x = (*compat13_sigsetjmp)(sjb, !expectsignal);
+ break;
+ default:
+ atf_tc_fail("unknown test");
+ }
if (x != 0) {
- if (test == TEST_LONGJMP_ZERO || test == TEST_U_LONGJMP_ZERO)
+ switch (test) {
+ case TEST_LONGJMP_ZERO:
+ case TEST_U_LONGJMP_ZERO:
+ case TEST_COMPAT13_LONGJMP_ZERO:
ATF_REQUIRE_MSG(x == 1, "setjmp returned wrong value");
- else
+ break;
+ default:
ATF_REQUIRE_MSG(x == i, "setjmp returned wrong value");
+ }
kill(i, SIGABRT);
ATF_REQUIRE_MSG(!expectsignal, "kill(SIGABRT) failed");
@@ -146,19 +244,39 @@ h_check(int test)
atf_tc_fail("setjmp returned zero after longjmp");
}
- REQUIRE_ERRNO(sigprocmask(SIG_UNBLOCK, &ss, NULL) != -1);
+ RL(sigprocmask(SIG_UNBLOCK, &ss, NULL));
did_longjmp = true;
- if (test == TEST_SETJMP)
+ switch (test) {
+ case TEST_SETJMP:
longjmp(jb, i);
- else if (test == TEST_LONGJMP_ZERO)
+ break;
+ case TEST_COMPAT13_SETJMP:
+ (*compat13_longjmp)(jb, i);
+ break;
+ case TEST_LONGJMP_ZERO:
longjmp(jb, 0);
- else if (test == TEST_U_SETJMP)
+ break;
+ case TEST_COMPAT13_LONGJMP_ZERO:
+ (*compat13_longjmp)(jb, 0);
+ break;
+ case TEST_U_SETJMP:
_longjmp(jb, i);
- else if (test == TEST_U_LONGJMP_ZERO)
+ break;
+ case TEST_U_LONGJMP_ZERO:
_longjmp(jb, 0);
- else
+ break;
+ case TEST_SIGSETJMP_SAVE:
+ case TEST_SIGSETJMP_NOSAVE:
siglongjmp(sjb, i);
+ break;
+ case TEST_COMPAT13_SIGSETJMP_SAVE:
+ case TEST_COMPAT13_SIGSETJMP_NOSAVE:
+ (*compat13_siglongjmp)(sjb, i);
+ break;
+ default:
+ atf_tc_fail("unknown test");
+ }
atf_tc_fail("jmp failed");
}
@@ -186,7 +304,8 @@ ATF_TC_BODY(_setjmp, tc)
ATF_TC(sigsetjmp_save);
ATF_TC_HEAD(sigsetjmp_save, tc)
{
- atf_tc_set_md_var(tc, "descr", "Checks sigsetjmp(3) with savemask enabled");
+ atf_tc_set_md_var(tc, "descr",
+ "Checks sigsetjmp(3) with savemask enabled");
}
ATF_TC_BODY(sigsetjmp_save, tc)
{
@@ -196,7 +315,8 @@ ATF_TC_BODY(sigsetjmp_save, tc)
ATF_TC(sigsetjmp_nosave);
ATF_TC_HEAD(sigsetjmp_nosave, tc)
{
- atf_tc_set_md_var(tc, "descr", "Checks sigsetjmp(3) with savemask disabled");
+ atf_tc_set_md_var(tc, "descr",
+ "Checks sigsetjmp(3) with savemask disabled");
}
ATF_TC_BODY(sigsetjmp_nosave, tc)
{
@@ -206,7 +326,8 @@ ATF_TC_BODY(sigsetjmp_nosave, tc)
ATF_TC(longjmp_zero);
ATF_TC_HEAD(longjmp_zero, tc)
{
- atf_tc_set_md_var(tc, "descr", "Checks longjmp(3) with a zero value");
+ atf_tc_set_md_var(tc, "descr",
+ "Checks longjmp(3) with a zero value");
}
ATF_TC_BODY(longjmp_zero, tc)
{
@@ -216,15 +337,69 @@ ATF_TC_BODY(longjmp_zero, tc)
ATF_TC(_longjmp_zero);
ATF_TC_HEAD(_longjmp_zero, tc)
{
- atf_tc_set_md_var(tc, "descr", "Checks _longjmp(3) with a zero value");
+ atf_tc_set_md_var(tc, "descr",
+ "Checks _longjmp(3) with a zero value");
}
ATF_TC_BODY(_longjmp_zero, tc)
{
h_check(TEST_U_LONGJMP_ZERO);
}
+ATF_TC(compat13_setjmp);
+ATF_TC_HEAD(compat13_setjmp, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Checks compat13 setjmp(3)");
+}
+ATF_TC_BODY(compat13_setjmp, tc)
+{
+#ifdef __arm__
+ atf_tc_expect_signal(-1, "PR port-arm/59351: compat_setjmp is busted");
+#endif
+ h_check(TEST_COMPAT13_SETJMP);
+}
+
+ATF_TC(compat13_sigsetjmp_save);
+ATF_TC_HEAD(compat13_sigsetjmp_save, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks compat13 sigsetjmp(3) with savemask enabled");
+}
+ATF_TC_BODY(compat13_sigsetjmp_save, tc)
+{
+#ifdef __arm__
+ atf_tc_expect_signal(-1, "PR port-arm/59351: compat_setjmp is busted");
+#endif
+ h_check(TEST_COMPAT13_SIGSETJMP_SAVE);
+}
+
+ATF_TC(compat13_sigsetjmp_nosave);
+ATF_TC_HEAD(compat13_sigsetjmp_nosave, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks compat13 sigsetjmp(3) with savemask disabled");
+}
+ATF_TC_BODY(compat13_sigsetjmp_nosave, tc)
+{
+ h_check(TEST_COMPAT13_SIGSETJMP_NOSAVE);
+}
+
+ATF_TC(compat13_longjmp_zero);
+ATF_TC_HEAD(compat13_longjmp_zero, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks compat13 longjmp(3) with a zero value");
+}
+ATF_TC_BODY(compat13_longjmp_zero, tc)
+{
+#ifdef __arm__
+ atf_tc_expect_signal(-1, "PR port-arm/59351: compat_setjmp is busted");
+#endif
+ h_check(TEST_COMPAT13_LONGJMP_ZERO);
+}
+
ATF_TP_ADD_TCS(tp)
{
+
ATF_TP_ADD_TC(tp, setjmp);
ATF_TP_ADD_TC(tp, _setjmp);
ATF_TP_ADD_TC(tp, sigsetjmp_save);
@@ -232,5 +407,10 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, longjmp_zero);
ATF_TP_ADD_TC(tp, _longjmp_zero);
+ ATF_TP_ADD_TC(tp, compat13_setjmp);
+ ATF_TP_ADD_TC(tp, compat13_sigsetjmp_save);
+ ATF_TP_ADD_TC(tp, compat13_sigsetjmp_nosave);
+ ATF_TP_ADD_TC(tp, compat13_longjmp_zero);
+
return atf_no_error();
}
diff --git a/lib/libc/ssp/Makefile b/lib/libc/ssp/Makefile
index faaa6f4f3342..5cd4442bc7fd 100644
--- a/lib/libc/ssp/Makefile
+++ b/lib/libc/ssp/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.11 2023/06/03 09:09:15 lukem Exp $
+# $NetBSD: Makefile,v 1.12 2023/11/10 23:03:25 christos Exp $
NOMAN= # defined
@@ -31,6 +31,7 @@ BINDIR= ${TESTSDIR}
PROGS= h_fgets
PROGS+= h_gets
PROGS+= h_getcwd
+PROGS+= h_getcwd2
PROGS+= h_memcpy
PROGS+= h_memmove
PROGS+= h_memset
diff --git a/lib/libc/ssp/t_ssp.sh b/lib/libc/ssp/t_ssp.sh
index 0514348fa5cf..51377e3df1df 100644
--- a/lib/libc/ssp/t_ssp.sh
+++ b/lib/libc/ssp/t_ssp.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ssp.sh,v 1.7 2014/04/06 19:28:59 christos Exp $
+# $NetBSD: t_ssp.sh,v 1.8 2023/11/10 23:03:25 christos Exp $
#
# Copyright (c) 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -284,6 +284,19 @@ getcwd_body()
h_fail "$prog 1025"
}
+atf_test_case getcwd2
+getcwd2_head()
+{
+ atf_set "descr" "Checks getcwd(3) override"
+}
+getcwd2_body()
+{
+ prog="$(atf_get_srcdir)/h_getcwd2"
+
+ atf_check -s exit:1 -o ignore \
+ -e 'match:.*getcwd failed: Function not implemented$' $prog
+}
+
atf_init_test_cases()
{
atf_add_test_case sprintf
@@ -305,4 +318,5 @@ atf_init_test_cases()
atf_add_test_case read
atf_add_test_case readlink
atf_add_test_case getcwd
+ atf_add_test_case getcwd2
}
diff --git a/lib/libc/stdio/t_fflush.c b/lib/libc/stdio/t_fflush.c
index 766070c907fb..7b4e9cbed9c1 100644
--- a/lib/libc/stdio/t_fflush.c
+++ b/lib/libc/stdio/t_fflush.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fflush.c,v 1.1 2011/09/11 05:15:55 jruoho Exp $ */
+/* $NetBSD: t_fflush.c,v 1.2 2025/12/18 17:09:58 christos Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fflush.c,v 1.1 2011/09/11 05:15:55 jruoho Exp $");
+__RCSID("$NetBSD: t_fflush.c,v 1.2 2025/12/18 17:09:58 christos Exp $");
#include <atf-c.h>
#include <errno.h>
@@ -51,22 +51,11 @@ ATF_TC_BODY(fflush_err, tc)
f = fopen(path, "w");
ATF_REQUIRE(f != NULL);
- ATF_REQUIRE(fflush(NULL) == 0);
- ATF_REQUIRE(fclose(f) == 0);
-
- f = fopen(path, "r");
- ATF_REQUIRE(f != NULL);
-
- /*
- * In NetBSD the call should fail if the supplied
- * parameteris not an open stream or the stream is
- * not open for writing.
- */
- errno = 0;
- ATF_REQUIRE_ERRNO(EBADF, fflush(f) == EOF);
-
+ ATF_REQUIRE(fflush(NULL) == 0); /* all files */
+ ATF_REQUIRE(fflush(f) == 0); /* this file */
ATF_REQUIRE(fclose(f) == 0);
+ /* Should fail on closed fp's, but really undefined behavior */
errno = 0;
ATF_REQUIRE_ERRNO(EBADF, fflush(f) == EOF);
@@ -135,6 +124,25 @@ ATF_TC_CLEANUP(fflush_seek, tc)
(void)unlink(path);
}
+ATF_TC(fflush_ro);
+ATF_TC_HEAD(fflush_ro, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test fflush(3) with read-only file");
+}
+
+ATF_TC_BODY(fflush_ro, tc)
+{
+ FILE *f;
+ char p;
+
+ f = fopen("/dev/null", "r");
+ ATF_REQUIRE(f != NULL);
+
+ ATF_REQUIRE(fread(&p, 1, 1, f) == 0);
+ ATF_REQUIRE(fflush(f) == 0);
+ ATF_REQUIRE(fclose(f) == 0);
+}
+
ATF_TC_WITH_CLEANUP(fpurge_err);
ATF_TC_HEAD(fpurge_err, tc)
{
@@ -159,12 +167,12 @@ ATF_TC_CLEANUP(fpurge_err, tc)
{
(void)unlink(path);
}
-
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, fflush_err);
ATF_TP_ADD_TC(tp, fflush_seek);
+ ATF_TP_ADD_TC(tp, fflush_ro);
ATF_TP_ADD_TC(tp, fpurge_err);
return atf_no_error();
diff --git a/lib/libc/stdio/t_intr.sh b/lib/libc/stdio/t_intr.sh
index 9a03b7ecd213..850a002e9db7 100644
--- a/lib/libc/stdio/t_intr.sh
+++ b/lib/libc/stdio/t_intr.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_intr.sh,v 1.6 2021/10/31 11:36:26 gson Exp $
+# $NetBSD: t_intr.sh,v 1.7 2024/05/01 11:40:25 gson Exp $
#
# Copyright (c) 2021 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -37,7 +37,10 @@ TMOUT=20
h_test() {
local avail=$( df -m . | awk '{if (int($4) > 0) print $4}' )
- local need=$(( 2 * $MAX * 8 / 1000000 ))
+ # The test data are stored in triplicate: numbers.in, numbers.out,
+ # and a temporary "stdout" file created by ATF. Each line consists
+ # of up to 7 digits and a newline for a total of 8 bytes.
+ local need=$(( 3 * $MAX * 8 / 1000000 ))
if [ $avail -lt $need ]; then
atf_skip "not enough free space in working directory"
fi
diff --git a/lib/libc/stdio/t_printf.c b/lib/libc/stdio/t_printf.c
index d193cdf9db08..500c46b16481 100644
--- a/lib/libc/stdio/t_printf.c
+++ b/lib/libc/stdio/t_printf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_printf.c,v 1.10 2023/04/04 19:39:38 he Exp $ */
+/* $NetBSD: t_printf.c,v 1.18 2024/05/11 14:39:53 riastradh Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -28,14 +28,16 @@
#include <sys/types.h>
#include <sys/resource.h>
+
#include <atf-c.h>
+#include <errno.h>
+#include <float.h>
#include <math.h>
-#include <stdio.h>
#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <time.h>
-#include <stdlib.h>
-#include <errno.h>
ATF_TC(snprintf_c99);
ATF_TC_HEAD(snprintf_c99, tc)
@@ -191,7 +193,68 @@ ATF_TC_BODY(snprintf_double_a, tc)
char buf[1000];
snprintf(buf, sizeof buf, "%.3a", (double)10.6);
- ATF_REQUIRE_STREQ("0x1.533p+3", buf);
+ ATF_CHECK_MSG((strcmp(buf, "0x1.533p+3") == 0 ||
+ strcmp(buf, "0x2.a66p+2") == 0 ||
+ strcmp(buf, "0x5.4cdp+1") == 0 ||
+ strcmp(buf, "0xa.99ap+0") == 0),
+ "buf=%s", buf);
+
+ snprintf(buf, sizeof buf, "%a", (double)0.125);
+ ATF_CHECK_MSG((strcmp(buf, "0x1p-3") == 0 ||
+ strcmp(buf, "0x2p-4") == 0 ||
+ strcmp(buf, "0x4p-5") == 0 ||
+ strcmp(buf, "0x8p-6") == 0),
+ "buf=%s", buf);
+}
+
+ATF_TC(snprintf_long_double_a);
+ATF_TC_HEAD(snprintf_long_double_a, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test printf La format");
+}
+
+ATF_TC_BODY(snprintf_long_double_a, tc)
+{
+ char buf[1000];
+
+ snprintf(buf, sizeof buf, "%.3La", 10.6L);
+ ATF_CHECK_MSG((strcmp(buf, "0x1.533p+3") == 0 ||
+ strcmp(buf, "0x2.a66p+2") == 0 ||
+ strcmp(buf, "0x5.4cdp+1") == 0 ||
+ strcmp(buf, "0xa.99ap+0") == 0),
+ "buf=%s", buf);
+
+ snprintf(buf, sizeof buf, "%La", 0.125L);
+ ATF_CHECK_MSG((strcmp(buf, "0x1p-3") == 0 ||
+ strcmp(buf, "0x2p-4") == 0 ||
+ strcmp(buf, "0x4p-5") == 0 ||
+ strcmp(buf, "0x8p-6") == 0),
+ "buf=%s", buf);
+
+ /*
+ * Test case adapted from:
+ *
+ * https://mail-index.netbsd.org/tech-userlevel/2020/04/11/msg012329.html
+ */
+#if LDBL_MAX_EXP >= 16384 && LDBL_MANT_DIG >= 64
+ snprintf(buf, sizeof buf, "%La", -0xc.ecececececececep+3788L);
+ ATF_CHECK_MSG((strcmp(buf, "-0x1.9d9d9d9d9d9d9d9cp+3791") == 0 ||
+ strcmp(buf, "-0x3.3b3b3b3b3b3b3b38p+3790") == 0 ||
+ strcmp(buf, "-0x6.7676767676767674p+3789") == 0 ||
+ strcmp(buf, "-0xc.ecececececececep+3788") == 0),
+ "buf=%s", buf);
+#endif
+
+#if LDBL_MAX_EXP >= 16384 && LDBL_MANT_DIG >= 113
+ snprintf(buf, sizeof buf, "%La",
+ -0x1.cecececececececececececececep+3791L);
+ ATF_CHECK_MSG((strcmp(buf,
+ "-0x1.cecececececececececececececep+3791") == 0 ||
+ strcmp(buf, "-0x3.3333333333333338p+3790") == 0 ||
+ strcmp(buf, "-0x6.767676767676767p+3789") == 0 ||
+ strcmp(buf, "-0xc.ecececececececep+3788") == 0),
+ "buf=%s", buf);
+#endif
}
/* is "long double" and "double" different? */
@@ -235,6 +298,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, snprintf_float);
ATF_TP_ADD_TC(tp, sprintf_zeropad);
ATF_TP_ADD_TC(tp, snprintf_double_a);
+ ATF_TP_ADD_TC(tp, snprintf_long_double_a);
#ifndef WIDE_DOUBLE
ATF_TP_ADD_TC(tp, pr57250_fix);
#endif
diff --git a/lib/libc/stdlib/Makefile b/lib/libc/stdlib/Makefile
index a7221b5033fc..7e27e99a1263 100644
--- a/lib/libc/stdlib/Makefile
+++ b/lib/libc/stdlib/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.34 2023/07/04 15:06:36 riastradh Exp $
+# $NetBSD: Makefile,v 1.36 2025/09/18 03:36:01 mrg Exp $
.include <bsd.own.mk>
@@ -23,6 +23,7 @@ TESTS_C+= t_system
TESTS_SH+= t_atexit
TESTS_SH+= t_getopt
+TESTS_SH+= t_sort
MKMAN=no
@@ -30,6 +31,7 @@ BINDIR= ${TESTSDIR}
PROGS+= h_atexit
PROGS+= h_getopt h_getopt_long
+PROGS+= h_sort
CFLAGS.t_posix_memalign.c+= -fno-builtin-posix_memalign
CFLAGS.t_posix_memalign.c+= -fno-builtin-aligned_alloc
@@ -41,4 +43,6 @@ DPADD.t_strtod+= ${LIBM}
LDADD.t_getenv_thread= -lpthread
LDADD.t_mktemp+= -Wl,--no-fatal-warnings
+COPTS.h_getopt_long.c+= ${CC_WNO_CALLOC_TRANSPOSED_ARGS}
+
.include <bsd.test.mk>
diff --git a/lib/libc/stdlib/t_strtod.c b/lib/libc/stdlib/t_strtod.c
index 21a57950b1da..9cb57b67e2ea 100644
--- a/lib/libc/stdlib/t_strtod.c
+++ b/lib/libc/stdlib/t_strtod.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_strtod.c,v 1.34 2015/12/22 14:19:25 christos Exp $ */
+/* $NetBSD: t_strtod.c,v 1.39 2025/04/07 02:28:00 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -32,9 +32,11 @@
/* Public domain, Otto Moerbeek <otto@drijf.net>, 2006. */
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_strtod.c,v 1.34 2015/12/22 14:19:25 christos Exp $");
+__RCSID("$NetBSD: t_strtod.c,v 1.39 2025/04/07 02:28:00 riastradh Exp $");
#include <errno.h>
+#include <fenv.h>
+#include <float.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
@@ -42,14 +44,10 @@ __RCSID("$NetBSD: t_strtod.c,v 1.34 2015/12/22 14:19:25 christos Exp $");
#include <atf-c.h>
-#include <fenv.h>
-
-#if !defined(__vax__)
static const char * const inf_strings[] =
{ "Inf", "INF", "-Inf", "-INF", "Infinity", "+Infinity",
"INFINITY", "-INFINITY", "InFiNiTy", "+InFiNiTy" };
-const char *nan_string = "NaN(x)y";
-#endif
+const char * const nan_string = "NaN(x)y";
ATF_TC(strtod_basic);
ATF_TC_HEAD(strtod_basic, tc)
@@ -68,8 +66,42 @@ ATF_TC_BODY(strtod_basic, tc)
errno = 0;
double d = strtod(buf, NULL);
- ATF_REQUIRE(d > 0.0);
- ATF_REQUIRE(errno == 0);
+ ATF_CHECK_MSG(d > 0, "i=%zu buf=\"%s\" d=%g errno=%d",
+ i, buf, d, errno);
+ ATF_CHECK_EQ_MSG(errno, 0, "i=%zu buf=\"%s\" d=%g errno=%d",
+ i, buf, d, errno);
+ }
+}
+
+ATF_TC(strtold_basic);
+ATF_TC_HEAD(strtold_basic, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Some examples of strtold(3)");
+}
+
+ATF_TC_BODY(strtold_basic, tc)
+{
+ static const struct {
+ const char *str;
+ long double val;
+ } testcases[] = {
+ { "0x0p0", 0.0L },
+ { "0x1.234p0", 0x1234 / 4096.0L },
+ { "0x1.234p0", 0x1234 / 4096.0L },
+#if FLT_RADIX == 2 && LDBL_MAX_EXP == 16384 && LDBL_MANT_DIG == 64
+ { "2.16", 0x8.a3d70a3d70a3d71p-2L },
+#endif
+ };
+
+ for (size_t i = 0, n = __arraycount(testcases); i < n; i++) {
+ char *end;
+ errno = 0;
+ long double val = strtold(testcases[i].str, &end);
+
+ ATF_CHECK_MSG(
+ errno == 0 && *end == '\0' && val == testcases[i].val,
+ "'%s' want %La have %La errno %d end '%s'",
+ testcases[i].str, testcases[i].val, val, errno, end);
}
}
@@ -79,12 +111,6 @@ ATF_TC_HEAD(strtod_hex, tc)
atf_tc_set_md_var(tc, "descr", "A strtod(3) with hexadecimals");
}
-#ifdef __vax__
-#define SMALL_NUM 1.0e-38
-#else
-#define SMALL_NUM 1.0e-40
-#endif
-
ATF_TC_BODY(strtod_hex, tc)
{
const char *str;
@@ -94,16 +120,18 @@ ATF_TC_BODY(strtod_hex, tc)
str = "-0x0";
d = strtod(str, &end); /* -0.0 */
- ATF_REQUIRE(end == str + 4);
- ATF_REQUIRE(signbit(d) != 0);
- ATF_REQUIRE(fabs(d) < SMALL_NUM);
+ ATF_CHECK_EQ_MSG(end, str + 4, "str=%p end=%p", str, end);
+ ATF_CHECK_MSG(signbit(d) != 0, "d=%g=%a signbit=%d", d, d, signbit(d));
+ ATF_CHECK_EQ_MSG(fabs(d), 0, "d=%g=%a, fabs(d)=%g=%a",
+ d, d, fabs(d), fabs(d));
str = "-0x";
d = strtod(str, &end); /* -0.0 */
- ATF_REQUIRE(end == str + 2);
- ATF_REQUIRE(signbit(d) != 0);
- ATF_REQUIRE(fabs(d) < SMALL_NUM);
+ ATF_CHECK_EQ_MSG(end, str + 2, "str=%p end=%p", str, end);
+ ATF_CHECK_MSG(signbit(d) != 0, "d=%g=%a signbit=%d", d, d, signbit(d));
+ ATF_CHECK_EQ_MSG(fabs(d), 0, "d=%g=%a fabs(d)=%g=%a",
+ d, d, fabs(d), fabs(d));
}
ATF_TC(strtod_inf);
@@ -114,14 +142,15 @@ ATF_TC_HEAD(strtod_inf, tc)
ATF_TC_BODY(strtod_inf, tc)
{
-#ifndef __vax__
+
+ if (!isinf(INFINITY))
+ atf_tc_skip("no infinities on this architecture");
+
for (size_t i = 0; i < __arraycount(inf_strings); i++) {
volatile double d = strtod(inf_strings[i], NULL);
- ATF_REQUIRE(isinf(d) != 0);
+ ATF_CHECK_MSG(isinf(d), "inf_strings[%zu]=\"%s\" d=%g=%a",
+ i, inf_strings[i], d, d);
}
-#else
- atf_tc_skip("vax not supported");
-#endif
}
ATF_TC(strtof_inf);
@@ -132,14 +161,17 @@ ATF_TC_HEAD(strtof_inf, tc)
ATF_TC_BODY(strtof_inf, tc)
{
-#ifndef __vax__
+
+ if (!isinf(INFINITY))
+ atf_tc_skip("no infinities on this architecture");
+
for (size_t i = 0; i < __arraycount(inf_strings); i++) {
volatile float f = strtof(inf_strings[i], NULL);
- ATF_REQUIRE(isinf(f) != 0);
+ ATF_CHECK_MSG(isinf(f), "inf_strings[%zu]=\"%s\" f=%g=%a",
+ i, inf_strings[i], f, f);
+ ATF_CHECK_MSG(isinff(f), "inf_strings[%zu]=\"%s\" f=%g=%a",
+ i, inf_strings[i], f, f);
}
-#else
- atf_tc_skip("vax not supported");
-#endif
}
ATF_TC(strtold_inf);
@@ -150,19 +182,15 @@ ATF_TC_HEAD(strtold_inf, tc)
ATF_TC_BODY(strtold_inf, tc)
{
-#ifndef __vax__
-# ifdef __HAVE_LONG_DOUBLE
+
+ if (!isinf(INFINITY))
+ atf_tc_skip("no infinities on this architecture");
for (size_t i = 0; i < __arraycount(inf_strings); i++) {
volatile long double ld = strtold(inf_strings[i], NULL);
- ATF_REQUIRE(isinf(ld) != 0);
+ ATF_CHECK_MSG(isinf(ld), "inf_strings[%zu]=\"%s\" ld=%Lg=%La",
+ i, inf_strings[i], ld, ld);
}
-# else
- atf_tc_skip("Requires long double support");
-# endif
-#else
- atf_tc_skip("vax not supported");
-#endif
}
ATF_TC(strtod_nan);
@@ -173,15 +201,16 @@ ATF_TC_HEAD(strtod_nan, tc)
ATF_TC_BODY(strtod_nan, tc)
{
-#ifndef __vax__
char *end;
- volatile double d = strtod(nan_string, &end);
- ATF_REQUIRE(isnan(d) != 0);
- ATF_REQUIRE(strcmp(end, "y") == 0);
-#else
- atf_tc_skip("vax not supported");
+#ifndef NAN
+ atf_tc_skip("no NaNs on this architecture");
#endif
+
+ volatile double d = strtod(nan_string, &end);
+ ATF_CHECK_MSG(isnan(d), "nan_string=\"%s\" d=%g=%a", nan_string, d, d);
+ ATF_CHECK_MSG(strcmp(end, "y") == 0, "nan_string=\"%s\"@%p end=%p",
+ nan_string, nan_string, end);
}
ATF_TC(strtof_nan);
@@ -192,15 +221,18 @@ ATF_TC_HEAD(strtof_nan, tc)
ATF_TC_BODY(strtof_nan, tc)
{
-#ifndef __vax__
char *end;
- volatile float f = strtof(nan_string, &end);
- ATF_REQUIRE(isnanf(f) != 0);
- ATF_REQUIRE(strcmp(end, "y") == 0);
-#else
- atf_tc_skip("vax not supported");
+#ifndef NAN
+ atf_tc_skip("no NaNs on this architecture");
#endif
+
+ volatile float f = strtof(nan_string, &end);
+ ATF_CHECK_MSG(isnan(f), "nan_string=\"%s\" f=%g=%a", nan_string, f, f);
+ ATF_CHECK_MSG(isnanf(f), "nan_string=\"%s\" f=%g=%a", nan_string,
+ f, f);
+ ATF_CHECK_MSG(strcmp(end, "y") == 0, "nan_string=\"%s\"@%p end=%p",
+ nan_string, nan_string, end);
}
ATF_TC(strtold_nan);
@@ -211,27 +243,25 @@ ATF_TC_HEAD(strtold_nan, tc)
ATF_TC_BODY(strtold_nan, tc)
{
-#ifndef __vax__
-# ifdef __HAVE_LONG_DOUBLE
-
char *end;
- volatile long double ld = strtold(nan_string, &end);
- ATF_REQUIRE(isnan(ld) != 0);
- ATF_REQUIRE(__isnanl(ld) != 0);
- ATF_REQUIRE(strcmp(end, "y") == 0);
-# else
- atf_tc_skip("Requires long double support");
-# endif
-#else
- atf_tc_skip("vax not supported");
+#ifndef NAN
+ atf_tc_skip("no NaNs on this architecture");
#endif
+
+ volatile long double ld = strtold(nan_string, &end);
+ ATF_CHECK_MSG(isnan(ld), "nan_string=\"%s\" ld=%Lg=%La",
+ nan_string, ld, ld);
+ ATF_CHECK_MSG(isnanf(ld), "nan_string=\"%s\" ld=%Lg=%La",
+ nan_string, ld, ld);
+ ATF_CHECK_MSG(strcmp(end, "y") == 0, "nan_string=\"%s\"@%p end=%p",
+ nan_string, nan_string, end);
}
ATF_TC(strtod_round);
ATF_TC_HEAD(strtod_round, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test rouding in strtod(3)");
+ atf_tc_set_md_var(tc, "descr", "Test rounding in strtod(3)");
}
ATF_TC_BODY(strtod_round, tc)
@@ -246,19 +276,10 @@ ATF_TC_BODY(strtod_round, tc)
"1.00000011920928977282585492503130808472633361816406";
(void)fesetround(FE_UPWARD);
-
volatile double d1 = strtod(val, NULL);
-
(void)fesetround(FE_DOWNWARD);
-
volatile double d2 = strtod(val, NULL);
-
- if (fabs(d1 - d2) > 0.0)
- return;
- else {
- atf_tc_expect_fail("PR misc/44767");
- atf_tc_fail("strtod(3) did not honor fesetround(3)");
- }
+ ATF_CHECK_MSG(d1 > d2, "d1=%g=%a d2=%g=%a", d1, d1, d2, d2);
#else
atf_tc_skip("Requires <fenv.h> support");
#endif
@@ -303,20 +324,61 @@ ATF_TC_HEAD(strtod_gherman_bug, tc)
ATF_TC_BODY(strtod_gherman_bug, tc)
{
-
- const char *str =
+ /*
+ * Input is _just barely below_ halfway from one binary64
+ * (p=53) floating-point number 0x1.d34fd8378ea83p+0 to the
+ * next one 0x1.d34fd8378ea84p+0:
+ *
+ * v
+ * 1.110100110100111111011000001101111000111010101000001101111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110..._2
+ */
+ const char *volatile str =
"1.8254370818746402660437411213933955878019332885742187";
+ int error;
errno = 0;
volatile double d = strtod(str, NULL);
+ error = errno;
+ ATF_CHECK_MSG(error == 0, "errno=%d (%s)", error, strerror(error));
+
+#if DBL_MANT_DIG == 53
+ ATF_CHECK_EQ_MSG(d, 0x1.d34fd8378ea83p+0, "d=%g=%a", d, d);
+#elif DBL_MANT_DIG == 56
+ /* a.k.a. 0xe.9a7ec1bc7541cp-3 */
+ ATF_CHECK_EQ_MSG(d, 0x1.d34fd8378ea838p+0, "d=%g=%a", d, d);
+#else
+# error Unknown DBL_MANT_DIG value!
+#endif
+
+#if DBL_MANT_DIG >= 56
+ /*
+ * Same deal, but VAX D (p=56) between 0xe.9a7ec1bc7541fp-3 and
+ * 0xe.9a7ec1bc75420p-3 (a.k.a. 0x1.d34fd8378ea83ep+0 and
+ * 0x1.d34fd8378ea840p+0, respectively):
+ *
+ * v
+ * 1.11010011010011111101100000110111100011101010100000111110111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110..._2
+ *
+ * (Not actually sure if this would have triggered the bug!
+ * Maybe someone with a VAX can try and find out.)
+ */
+ str = "1.8254370818746403631882557760945928748697042465209960";
- ATF_CHECK(d == 0x1.d34fd8378ea83p+0);
+ errno = 0;
+ d = strtod(str, NULL);
+ error = errno;
+ ATF_CHECK_MSG(error == 0, "errno=%d (%s)", error, strerror(error));
+
+ /* a.k.a. 0x1.d34fd8378ea83ep+0 */
+ ATF_CHECK_EQ_MSG(d, 0xe.9a7ec1bc7541fp-3, "d=%g=%a", d, d);
+#endif
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, strtod_basic);
+ ATF_TP_ADD_TC(tp, strtold_basic);
ATF_TP_ADD_TC(tp, strtod_hex);
ATF_TP_ADD_TC(tp, strtod_inf);
ATF_TP_ADD_TC(tp, strtof_inf);
diff --git a/lib/libc/stdlib/t_strtoi.c b/lib/libc/stdlib/t_strtoi.c
index 82d9d5b4f90a..1d9c6bff3ad5 100644
--- a/lib/libc/stdlib/t_strtoi.c
+++ b/lib/libc/stdlib/t_strtoi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_strtoi.c,v 1.2 2017/04/28 19:01:01 kamil Exp $ */
+/* $NetBSD: t_strtoi.c,v 1.5 2024/07/24 09:26:06 kre Exp $ */
/*-
* Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_strtoi.c,v 1.2 2017/04/28 19:01:01 kamil Exp $");
+__RCSID("$NetBSD: t_strtoi.c,v 1.5 2024/07/24 09:26:06 kre Exp $");
#include <atf-c.h>
#include <errno.h>
@@ -61,19 +61,49 @@ check(struct test *t, intmax_t rv, char *end, int rstatus)
{
if (rv != t->res)
- atf_tc_fail_nonfatal("strtoi(%s, &end, %d, %jd, %jd, &rstatus)"
- " failed (rv = %jd)", t->str, t->base, t->lo, t->hi, rv);
+ atf_tc_fail_nonfatal("strtoi(\"%s\", &end, %d, %jd, %jd, "
+ "&rstatus) failed (rv = %jd)", t->str, t->base,
+ t->lo, t->hi, rv);
- if (rstatus != t->rstatus)
- atf_tc_fail_nonfatal("strtoi(%s, &end, %d, %jd, %jd, &rstatus)"
- " failed (rstatus: %d ('%s'))",
- t->str, t->base, t->lo, t->hi, rstatus, strerror(rstatus));
+ if (rstatus != t->rstatus) {
+ char *emsg;
+
+ if (rstatus != 0) {
+ emsg = strerror(rstatus);
+ if (emsg != NULL) {
+ emsg = strdup(emsg);
+ if (emsg == NULL) {
+ atf_tc_fail("Out of Memory");
+ return;
+ }
+ }
+ } else
+ emsg = NULL;
+
+ atf_tc_fail_nonfatal("strtoi(\"%s\", &end, %d, %jd, %jd, &rstatus)"
+ " failed (rstatus: %d %s%s%sexpected %d%s%s%s)",
+ t->str, t->base, t->lo, t->hi, rstatus, rstatus ? "('" : "",
+ emsg != NULL ? emsg : "", rstatus ? "') " : "", t->rstatus,
+ t->rstatus ? " ('" : "", t->rstatus ? strerror(t->rstatus)
+ : "", t->rstatus ? "')" : "");
+
+ free(emsg);
+ }
if ((t->end != NULL && strcmp(t->end, end) != 0) ||
(t->end == NULL && *end != '\0'))
atf_tc_fail_nonfatal("invalid end pointer ('%s') from "
- "strtoi(%s, &end, %d, %jd, %jd, &rstatus)",
- end, t->str, t->base, t->lo, t->hi);
+ "strtoi(\"%s\", &end, %d, %jd, %jd, &rstatus), "
+ "expected '%s'", end, t->str, t->base, t->lo, t->hi,
+ t->end != NULL ? t->end : "\\0");
+}
+
+static void
+check_errno(int e)
+{
+ if (e != 0)
+ atf_tc_fail("strtoi(3) changed errno to %d ('%s')",
+ e, strerror(e));
}
ATF_TC(strtoi_base);
@@ -126,6 +156,18 @@ ATF_TC_BODY(strtoi_base, tc)
{ "0x75bcd15", 123456789, 0, NULL,
INTMAX_MIN, INTMAX_MAX, 0 },
};
+ struct test f[] = {
+ { "1", 0, 1, "1",
+ INTMAX_MIN, INTMAX_MAX, EINVAL },
+ { "2", 0, -1, "2",
+ INTMAX_MIN, INTMAX_MAX, EINVAL },
+ { "3", 0, 37, "3",
+ INTMAX_MIN, INTMAX_MAX, EINVAL },
+ { "4", 0, -1, "4",
+ INTMAX_MIN, INTMAX_MAX, EINVAL },
+ { "0x", 0, 0, "x",
+ INTMAX_MIN, INTMAX_MAX, ENOTSUP },
+ };
intmax_t rv;
char *end;
@@ -137,12 +179,23 @@ ATF_TC_BODY(strtoi_base, tc)
errno = 0;
rv = strtoi(t[i].str, &end, t[i].base, t[i].lo, t[i].hi, &e);
- if (errno != 0)
- atf_tc_fail("strtoi(3) changed errno to %d ('%s')",
- e, strerror(e));
+ check_errno(errno);
check(&t[i], rv, end, e);
}
+
+ for (i = 0; i < __arraycount(f); i++) {
+
+ end = NULL;
+ errno = 0;
+ e = -99;
+
+ rv = strtoi(f[i].str, &end, f[i].base, f[i].lo, f[i].hi, &e);
+
+ check_errno(errno);
+
+ check(&f[i], rv, end, e);
+ }
}
ATF_TC(strtoi_case);
@@ -184,9 +237,7 @@ ATF_TC_BODY(strtoi_case, tc)
errno = 0;
rv = strtoi(t[i].str, &end, t[i].base, t[i].lo, t[i].hi, &e);
- if (errno != 0)
- atf_tc_fail("strtoi(3) changed errno to %d ('%s')",
- e, strerror(e));
+ check_errno(errno);
check(&t[i], rv, end, e);
}
@@ -211,10 +262,22 @@ ATF_TC_BODY(strtoi_range, tc)
#else
#error extend this test to your platform!
#endif
- { "10", 1, 10, NULL,
- -1, 1, ERANGE },
- { "10", 11, 10, NULL,
- 11, 20, ERANGE },
+ { "10", 1, 10, NULL,
+ -1, 1, ERANGE },
+ { "10", 11, 10, NULL,
+ 11, 20, ERANGE },
+ { "7", 7, 0, NULL,
+ 7, 7, 0 },
+ { "6", 7, 0, NULL,
+ 7, 7, ERANGE },
+ { "8", 7, 0, NULL,
+ 7, 7, ERANGE },
+ { "7x", 7, 0, "x",
+ 7, 7, ENOTSUP },
+ { "8x", 7, 0, "x",
+ 7, 7, ERANGE },
+ { "Z", 11, 10, "Z",
+ 11, 20, ECANCELED },
};
intmax_t rv;
@@ -228,8 +291,41 @@ ATF_TC_BODY(strtoi_range, tc)
rv = strtoi(t[i].str, &end, t[i].base, t[i].lo, t[i].hi, &e);
if (errno != 0)
- atf_tc_fail("strtoi(3) changed errno to %d ('%s')",
- e, strerror(e));
+ atf_tc_fail("Range test %zd set errno=%d", i, errno);
+ check_errno(errno);
+
+ check(&t[i], rv, end, e);
+ }
+}
+
+ATF_TC(strtoi_range_trail);
+ATF_TC_HEAD(strtoi_range_trail, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test ERANGE from strtoi(3) "
+ "with trailing characters");
+}
+
+ATF_TC_BODY(strtoi_range_trail, tc)
+{
+ struct test t[] = {
+ { "11x", 9, 10, "x", 0, 9, ERANGE },
+ { " -3y", -2, 10, "y", -2, 1, ERANGE },
+ { "11111z", 9, 10, "z", 0, 9, ERANGE },
+ { "+0xAq", 9, 16, "q", 0, 9, ERANGE },
+ { "-0xBAr", 0, 16, "r", 0, 9, ERANGE },
+ };
+
+ intmax_t rv;
+ char *end;
+ int e;
+ size_t i;
+
+ for (i = 0; i < __arraycount(t); i++) {
+
+ errno = 0;
+ rv = strtoi(t[i].str, &end, t[i].base, t[i].lo, t[i].hi, &e);
+
+ check_errno(errno);
check(&t[i], rv, end, e);
}
@@ -284,9 +380,7 @@ ATF_TC_BODY(strtoi_signed, tc)
errno = 0;
rv = strtoi(t[i].str, &end, t[i].base, t[i].lo, t[i].hi, &e);
- if (errno != 0)
- atf_tc_fail("strtoi(3) changed errno to %d ('%s')",
- e, strerror(e));
+ check_errno(errno);
check(&t[i], rv, end, e);
}
@@ -298,6 +392,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, strtoi_base);
ATF_TP_ADD_TC(tp, strtoi_case);
ATF_TP_ADD_TC(tp, strtoi_range);
+ ATF_TP_ADD_TC(tp, strtoi_range_trail);
ATF_TP_ADD_TC(tp, strtoi_signed);
return atf_no_error();
diff --git a/lib/libc/stdlib/t_strtol.c b/lib/libc/stdlib/t_strtol.c
index 3f269f7c35cd..e87afc68ca8e 100644
--- a/lib/libc/stdlib/t_strtol.c
+++ b/lib/libc/stdlib/t_strtol.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_strtol.c,v 1.7 2017/07/06 21:08:44 joerg Exp $ */
+/* $NetBSD: t_strtol.c,v 1.8 2024/07/22 16:41:05 christos Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -30,10 +30,11 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_strtol.c,v 1.7 2017/07/06 21:08:44 joerg Exp $");
+__RCSID("$NetBSD: t_strtol.c,v 1.8 2024/07/22 16:41:05 christos Exp $");
#include <atf-c.h>
#include <errno.h>
+#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
@@ -45,10 +46,8 @@ struct test {
const char *end;
};
-static void check(struct test *, long int, long long int, char *);
-
static void
-check(struct test *t, long int li, long long int lli, char *end)
+check(struct test *t, long int li, long long int lli, intmax_t ji, char *end)
{
if (li != -1 && li != t->res)
@@ -59,6 +58,10 @@ check(struct test *t, long int li, long long int lli, char *end)
atf_tc_fail_nonfatal("strtoll(%s, NULL, %d) failed "
"(rv = %lld)", t->str, t->base, lli);
+ if (ji != -1 && ji != t->res)
+ atf_tc_fail_nonfatal("strtoll(%s, NULL, %d) failed "
+ "(rv = %jd)", t->str, t->base, ji);
+
if ((t->end != NULL && strcmp(t->end, end) != 0) ||
(t->end == NULL && *end != '\0'))
atf_tc_fail_nonfatal("invalid end pointer (%p) from "
@@ -102,8 +105,10 @@ ATF_TC_BODY(strtol_base, tc)
long long int lli;
long int li;
+ intmax_t ji;
long long int ulli;
long int uli;
+ uintmax_t uji;
char *end, *end2;
size_t i;
@@ -111,24 +116,68 @@ ATF_TC_BODY(strtol_base, tc)
li = strtol(t[i].str, &end, t[i].base);
lli = strtoll(t[i].str, NULL, t[i].base);
+ ji = strtoimax(t[i].str, NULL, t[i].base);
uli = strtoul(t[i].str, &end2, t[i].base);
ulli = strtoull(t[i].str, NULL, t[i].base);
+ uji = strtoumax(t[i].str, NULL, t[i].base);
- check(&t[i], li, lli, end);
+ check(&t[i], li, lli, ji, end);
if (li != uli)
atf_tc_fail_nonfatal("strtoul(%s, NULL, %d) failed "
"(rv = %lu)", t[i].str, t[i].base, uli);
- if (end != end2)
- atf_tc_fail_nonfatal("invalid end pointer ('%p') from "
- "strtoul(%s, &end, %d)", end2, t[i].str, t[i].base);
if (lli != ulli)
atf_tc_fail_nonfatal("strtoull(%s, NULL, %d) failed "
"(rv = %llu)", t[i].str, t[i].base, ulli);
+ if ((uintmax_t)ji != uji)
+ atf_tc_fail_nonfatal("strtoumax(%s, NULL, %d) failed "
+ "(rv = %ju)", t[i].str, t[i].base, uji);
+ if (end != end2)
+ atf_tc_fail_nonfatal("invalid end pointer ('%p') from "
+ "strtoul(%s, &end, %d)", end2, t[i].str, t[i].base);
}
}
+ATF_TC(strtol_invbase);
+ATF_TC_HEAD(strtol_invbase, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test strtol(3) with an invalid base");
+}
+
+ATF_TC_BODY(strtol_invbase, tc)
+{
+ long long int lli;
+ long int li;
+ intmax_t ji;
+ long long int ulli;
+ long int uli;
+ uintmax_t uji;
+ char *end;
+ char boo[] = "boo";
+ const char str[] = "1";
+
+#define CHECK(r, f, fun) \
+ end = boo; \
+ r = fun(str, &end, -2); \
+ if (strcmp(str, end) != 0) \
+ atf_tc_fail_nonfatal( \
+ "%s(1, boo, -2) failed endptr=%s ", # fun, end); \
+ if (r) \
+ atf_tc_fail_nonfatal( \
+ "%s(1, boo, -2) failed rv=" f, # fun, r); \
+ if (errno != EINVAL) \
+ atf_tc_fail_nonfatal( \
+ "%s(1, boo, -2) failed errno=%d", # fun, errno)
+
+ CHECK(li, "%ld", strtol);
+ CHECK(lli, "%lld", strtoll);
+ CHECK(ji, "%jd", strtoimax);
+ CHECK(uli, "%lu", strtoul);
+ CHECK(ulli, "%llu", strtoull);
+ CHECK(uji, "%ju", strtoumax);
+}
+
ATF_TC(strtol_case);
ATF_TC_HEAD(strtol_case, tc)
{
@@ -151,6 +200,7 @@ ATF_TC_BODY(strtol_case, tc)
long long int lli;
long int li;
+ intmax_t ji;
char *end;
size_t i;
@@ -158,8 +208,9 @@ ATF_TC_BODY(strtol_case, tc)
li = strtol(t[i].str, &end, t[i].base);
lli = strtoll(t[i].str, NULL, t[i].base);
+ ji = strtoimax(t[i].str, NULL, t[i].base);
- check(&t[i], li, lli, end);
+ check(&t[i], li, lli, ji, end);
}
}
@@ -199,7 +250,7 @@ ATF_TC_BODY(strtol_range, tc)
if (errno != ERANGE)
atf_tc_fail("strtol(3) did not catch ERANGE");
- check(&t[i], li, -1, end);
+ check(&t[i], li, -1, -1, end);
}
}
@@ -230,6 +281,7 @@ ATF_TC_BODY(strtol_signed, tc)
long long int lli;
long int li;
+ intmax_t ji;
char *end;
size_t i;
@@ -237,14 +289,16 @@ ATF_TC_BODY(strtol_signed, tc)
li = strtol(t[i].str, &end, t[i].base);
lli = strtoll(t[i].str, NULL, t[i].base);
+ ji = strtoimax(t[i].str, NULL, t[i].base);
- check(&t[i], li, lli, end);
+ check(&t[i], li, lli, ji, end);
}
}
ATF_TP_ADD_TCS(tp)
{
+ ATF_TP_ADD_TC(tp, strtol_invbase);
ATF_TP_ADD_TC(tp, strtol_base);
ATF_TP_ADD_TC(tp, strtol_case);
ATF_TP_ADD_TC(tp, strtol_range);
diff --git a/lib/libc/string/t_bm.c b/lib/libc/string/t_bm.c
index 5ec402297538..9a67ff4638c0 100644
--- a/lib/libc/string/t_bm.c
+++ b/lib/libc/string/t_bm.c
@@ -1,4 +1,4 @@
-/* $Id: t_bm.c,v 1.1 2014/06/23 10:53:20 shm Exp $ */
+/* $Id: t_bm.c,v 1.3 2024/07/11 03:55:58 kre Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$Id: t_bm.c,v 1.1 2014/06/23 10:53:20 shm Exp $");
+__RCSID("$Id: t_bm.c,v 1.3 2024/07/11 03:55:58 kre Exp $");
#include <atf-c.h>
#include <stdio.h>
@@ -77,10 +77,10 @@ ATF_TC_BODY(bm, tc)
bm_pat *pattern;
for (ts = 0; ts < sizeof(testcases)/sizeof(t_testcase); ts++) {
- ATF_CHECK(pattern = bm_comp((const u_char *)testcases[ts].pattern,
- strlen(testcases[ts].pattern), (const u_char *)testcases[ts].freq));
+ ATF_CHECK((pattern = bm_comp((const u_char *)testcases[ts].pattern,
+ strlen(testcases[ts].pattern), (const u_char *)testcases[ts].freq)));
- ATF_REQUIRE(text = strdup(testcases[ts].text));
+ ATF_REQUIRE((text = strdup(testcases[ts].text)));
off = bm_exec(pattern, (u_char *)text, strlen(text));
if (testcases[ts].match == -1)
diff --git a/lib/libc/string/t_memset.c b/lib/libc/string/t_memset.c
index 5a2be2896654..457b0ed52b01 100644
--- a/lib/libc/string/t_memset.c
+++ b/lib/libc/string/t_memset.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_memset.c,v 1.4 2015/09/11 09:25:52 martin Exp $ */
+/* $NetBSD: t_memset.c,v 1.5 2024/11/02 02:43:48 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_memset.c,v 1.4 2015/09/11 09:25:52 martin Exp $");
+__RCSID("$NetBSD: t_memset.c,v 1.5 2024/11/02 02:43:48 riastradh Exp $");
#include <sys/stat.h>
@@ -44,6 +44,15 @@ static bool check(char *, size_t, char);
int zero; /* always zero, but the compiler does not know */
+static const struct {
+ const char *name;
+ void *(*fn)(void *, int, size_t);
+} memsetfn[] = {
+ { "memset", &memset },
+ { "explicit_memset", &explicit_memset }, /* NetBSD extension */
+ { "memset_explicit", &memset_explicit }, /* C23 adopted name */
+};
+
ATF_TC(memset_array);
ATF_TC_HEAD(memset_array, tc)
{
@@ -53,16 +62,19 @@ ATF_TC_HEAD(memset_array, tc)
ATF_TC_BODY(memset_array, tc)
{
char buf[1024];
+ unsigned i;
- (void)memset(buf, 0, sizeof(buf));
-
- if (check(buf, sizeof(buf), 0) != true)
- atf_tc_fail("memset(3) did not fill a static buffer");
-
- (void)memset(buf, 'x', sizeof(buf));
+ for (i = 0; i < __arraycount(memsetfn); i++) {
+ (void)(*memsetfn[i].fn)(buf, 0, sizeof(buf));
+ ATF_CHECK_MSG(check(buf, sizeof(buf), 0),
+ "%s did not fill a static buffer",
+ memsetfn[i].name);
- if (check(buf, sizeof(buf), 'x') != true)
- atf_tc_fail("memset(3) did not fill a static buffer");
+ (void)(*memsetfn[i].fn)(buf, 'x', sizeof(buf));
+ ATF_CHECK_MSG(check(buf, sizeof(buf), 'x'),
+ "%s did not fill a static buffer",
+ memsetfn[i].name);
+ }
}
ATF_TC(memset_return);
@@ -75,8 +87,15 @@ ATF_TC_BODY(memset_return, tc)
{
char *b = (char *)0x1;
char c[2];
- ATF_REQUIRE_EQ(memset(b, 0, 0), b);
- ATF_REQUIRE_EQ(memset(c, 2, sizeof(c)), c);
+ char *p;
+ unsigned i;
+
+ for (i = 0; i < __arraycount(memsetfn); i++) {
+ ATF_CHECK_EQ_MSG((p = (*memsetfn[i].fn)(b, 0, 0)), b,
+ "%s: returned %p, expected %p", memsetfn[i].name, p, b);
+ ATF_CHECK_EQ_MSG((p = (*memsetfn[i].fn)(c, 2, sizeof(c))), c,
+ "%s: returned %p, expected %p", memsetfn[i].name, p, c);
+ }
}
ATF_TC(memset_basic);
@@ -88,6 +107,7 @@ ATF_TC_HEAD(memset_basic, tc)
ATF_TC_BODY(memset_basic, tc)
{
char *buf, *ret;
+ unsigned i;
buf = malloc(page);
ret = malloc(page);
@@ -95,15 +115,19 @@ ATF_TC_BODY(memset_basic, tc)
ATF_REQUIRE(buf != NULL);
ATF_REQUIRE(ret != NULL);
- fill(ret, page, 0);
- memset(buf, 0, page);
+ for (i = 0; i < __arraycount(memsetfn); i++) {
+ fill(ret, page, 0);
+ (*memsetfn[i].fn)(buf, 0, page);
- ATF_REQUIRE(memcmp(ret, buf, page) == 0);
+ ATF_CHECK_EQ_MSG(memcmp(ret, buf, page), 0, "%s",
+ memsetfn[i].name);
- fill(ret, page, 'x');
- memset(buf, 'x', page);
+ fill(ret, page, 'x');
+ (*memsetfn[i].fn)(buf, 'x', page);
- ATF_REQUIRE(memcmp(ret, buf, page) == 0);
+ ATF_CHECK_EQ_MSG(memcmp(ret, buf, page), 0, "%s",
+ memsetfn[i].name);
+ }
free(buf);
free(ret);
@@ -119,17 +143,18 @@ ATF_TC_BODY(memset_nonzero, tc)
{
const size_t n = 0x7f;
char *buf;
- size_t i;
+ size_t i, j;
buf = malloc(page);
ATF_REQUIRE(buf != NULL);
for (i = 0x21; i < n; i++) {
-
- (void)memset(buf, i, page);
-
- if (check(buf, page, i) != true)
- atf_tc_fail("memset(3) did not fill properly");
+ for (j = 0; j < __arraycount(memsetfn); j++) {
+ (void)(*memsetfn[j].fn)(buf, i, page);
+ ATF_CHECK_MSG(check(buf, page, i),
+ "%s did not fill properly with %zu",
+ memsetfn[j].name, i);
+ }
}
free(buf);
@@ -145,16 +170,19 @@ ATF_TC_HEAD(memset_zero_size, tc)
ATF_TC_BODY(memset_zero_size, tc)
{
char buf[1024];
+ unsigned i;
- (void)memset(buf, 'x', sizeof(buf));
+ for (i = 0; i < __arraycount(memsetfn); i++) {
+ (void)(*memsetfn[i].fn)(buf, 'x', sizeof(buf));
+ ATF_CHECK_MSG(check(buf, sizeof(buf), 'x'),
+ "%s did not fill a static buffer",
+ memsetfn[i].name);
- if (check(buf, sizeof(buf), 'x') != true)
- atf_tc_fail("memset(3) did not fill a static buffer");
-
- (void)memset(buf+sizeof(buf)/2, 0, zero);
-
- if (check(buf, sizeof(buf), 'x') != true)
- atf_tc_fail("memset(3) with 0 size did change the buffer");
+ (void)memset(buf+sizeof(buf)/2, 0, zero);
+ ATF_CHECK_MSG(check(buf, sizeof(buf), 'x'),
+ "%s with 0 size did change the buffer",
+ memsetfn[i].name);
+ }
}
ATF_TC(bzero_zero_size);
@@ -188,30 +216,33 @@ ATF_TC_HEAD(memset_struct, tc)
ATF_TC_BODY(memset_struct, tc)
{
struct stat st;
+ unsigned i;
- st.st_dev = 0;
- st.st_ino = 1;
- st.st_mode = 2;
- st.st_nlink = 3;
- st.st_uid = 4;
- st.st_gid = 5;
- st.st_rdev = 6;
- st.st_size = 7;
- st.st_atime = 8;
- st.st_mtime = 9;
+ for (i = 0; i < __arraycount(memsetfn); i++) {
+ st.st_dev = 0;
+ st.st_ino = 1;
+ st.st_mode = 2;
+ st.st_nlink = 3;
+ st.st_uid = 4;
+ st.st_gid = 5;
+ st.st_rdev = 6;
+ st.st_size = 7;
+ st.st_atime = 8;
+ st.st_mtime = 9;
- (void)memset(&st, 0, sizeof(struct stat));
+ (void)(*memsetfn[i].fn)(&st, 0, sizeof(struct stat));
- ATF_CHECK(st.st_dev == 0);
- ATF_CHECK(st.st_ino == 0);
- ATF_CHECK(st.st_mode == 0);
- ATF_CHECK(st.st_nlink == 0);
- ATF_CHECK(st.st_uid == 0);
- ATF_CHECK(st.st_gid == 0);
- ATF_CHECK(st.st_rdev == 0);
- ATF_CHECK(st.st_size == 0);
- ATF_CHECK(st.st_atime == 0);
- ATF_CHECK(st.st_mtime == 0);
+ ATF_CHECK_MSG(st.st_dev == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_ino == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_mode == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_nlink == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_uid == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_gid == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_rdev == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_size == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_atime == 0, "%s", memsetfn[i].name);
+ ATF_CHECK_MSG(st.st_mtime == 0, "%s", memsetfn[i].name);
+ }
}
static void
diff --git a/lib/libc/sys/Makefile b/lib/libc/sys/Makefile
index 21e66aa74946..5d808b2a7700 100644
--- a/lib/libc/sys/Makefile
+++ b/lib/libc/sys/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.74 2023/08/08 06:27:32 mrg Exp $
+# $NetBSD: Makefile,v 1.80 2025/10/10 15:53:55 christos Exp $
MKMAN= no
@@ -9,6 +9,10 @@ MKMAN= no
TESTSDIR= ${TESTSBASE}/lib/libc/sys
TESTS_C+= t_access
+TESTS_C+= t_aio_cancel
+TESTS_C+= t_aio_lio
+TESTS_C+= t_aio_rw
+TESTS_C+= t_aio_suspend
TESTS_C+= t_bind
TESTS_C+= t_chroot
TESTS_C+= t_clock_gettime
@@ -36,10 +40,10 @@ TESTS_C+= t_kevent
TESTS_C+= t_kill
TESTS_C+= t_link
TESTS_C+= t_listen
-TESTS_C+= t_lwp_ctl
TESTS_C+= t_lwp_create
-TESTS_C+= t_minherit
+TESTS_C+= t_lwp_ctl
TESTS_C+= t_mincore
+TESTS_C+= t_minherit
TESTS_C+= t_mkdir
TESTS_C+= t_mkfifo
TESTS_C+= t_mknod
@@ -59,6 +63,7 @@ TESTS_C+= t_pollts
TESTS_C+= t_posix_fallocate
TESTS_C+= t_ppoll
TESTS_C+= t_ptrace
+TESTS_C+= t_ptrace_kill
TESTS_C+= t_ptrace_sigchld
TESTS_C+= t_ptrace_wait
TESTS_C+= t_ptrace_wait3
@@ -78,8 +83,8 @@ TESTS_C+= t_sigaltstack
TESTS_C+= t_sigqueue
TESTS_C+= t_sigtimedwait
TESTS_C+= t_socketpair
-TESTS_C+= t_swapcontext
TESTS_C+= t_stat
+TESTS_C+= t_swapcontext
TESTS_C+= t_syscall
TESTS_C+= t_timer_create
TESTS_C+= t_timerfd
@@ -95,9 +100,16 @@ TESTS_C+= t_write
SRCS.t_mprotect= t_mprotect.c ${SRCS_EXEC_PROT} t_mprotect_helper.c
+LDADD.t_aio_cancel+= -lrt -lpthread
+LDADD.t_aio_suspend+= -lrt -lpthread
+LDADD.t_aio_rw+= -lrt -lpthread
+LDADD.t_aio_lio+= -lrt -lpthread
+
LDADD.t_eventfd+= -lpthread
LDADD.t_getpid+= -lpthread
LDADD.t_mmap+= -lpthread
+LDADD.t_poll+= -lpthread
+LDADD.t_ptrace_kill+= -lpthread
LDADD.t_timerfd+= -lpthread
LDADD.t_ptrace_sigchld+= -pthread -lm
@@ -149,7 +161,8 @@ FILESGRP_truncate_test.root_owned= wheel
CLEANFILES= truncate_test.root_owned
truncate_test.root_owned:
- dd if=/dev/null bs=1 count=1 of=${.TARGET}
+ @${_MKTARGET_CREATE}
+ touch ${.TARGET}
WARNS= 4
diff --git a/lib/libc/sys/t_clock_gettime.c b/lib/libc/sys/t_clock_gettime.c
index 6421b1ab0cb8..abe0dce623d0 100644
--- a/lib/libc/sys/t_clock_gettime.c
+++ b/lib/libc/sys/t_clock_gettime.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_clock_gettime.c,v 1.6 2023/07/09 19:19:40 riastradh Exp $ */
+/* $NetBSD: t_clock_gettime.c,v 1.10 2025/03/25 19:51:32 riastradh Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_clock_gettime.c,v 1.6 2023/07/09 19:19:40 riastradh Exp $");
+__RCSID("$NetBSD: t_clock_gettime.c,v 1.10 2025/03/25 19:51:32 riastradh Exp $");
#include <sys/param.h>
@@ -117,10 +117,12 @@ check_timecounter(void)
if (diff < 0 || diff > MINPOSDIFF) {
long long elapsed;
- (void)printf("%stime TSA: 0x%jx.%08jx, TSB: 0x%jx.%08jx, "
+ (void)printf("%stime"
+ " TSA: 0x%jx.%08jx, TSB: 0x%jx.%08jx, "
"diff = %lld nsec, ", (diff < 0) ? "BAD " : "",
(uintmax_t)tsa.tv_sec, (uintmax_t)tsa.tv_nsec,
- (uintmax_t)tsb.tv_sec, (uintmax_t)tsb.tv_nsec, diff);
+ (uintmax_t)tsb.tv_sec, (uintmax_t)tsb.tv_nsec,
+ diff);
elapsed = 1000000000LL * (tsb.tv_sec - tsl.tv_sec)
+ tsb.tv_nsec - tsl.tv_nsec;
@@ -285,12 +287,48 @@ ATF_TC_BODY(clock_gettime_thread_cputime_is_monotonic, tc)
CLOCK_THREAD_CPUTIME_ID, &waste_user_time);
}
+static void
+check_resolution(const char *clockname, clockid_t clockid)
+{
+ struct timespec ts;
+ int rv;
+
+ RLF(rv = clock_getres(clockid, &ts), "%s", clockname);
+ if (rv != -1) {
+ ATF_CHECK_MSG(ts.tv_sec == 0,
+ "The resolution of the clock %s is reported as %jd.%09ld"
+ " which is lower than a second; most likely a wrong value",
+ clockname, ts.tv_sec, ts.tv_nsec);
+ }
+}
+
+ATF_TC(clock_getres);
+ATF_TC_HEAD(clock_getres, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks that clock_getres(2) returns some reasonable resolution"
+ " for all supported clocks");
+}
+ATF_TC_BODY(clock_getres, tc)
+{
+ check_resolution("CLOCK_REALTIME", CLOCK_REALTIME);
+ check_resolution("CLOCK_MONOTONIC", CLOCK_MONOTONIC);
+ atf_tc_expect_fail("These clocks aren't supported but are documented"
+ " in clock_gettime(2) for some reason");
+ check_resolution("CLOCK_VIRTUAL", CLOCK_VIRTUAL);
+ check_resolution("CLOCK_PROF", CLOCK_PROF);
+ atf_tc_expect_pass();
+ check_resolution("CLOCK_PROCESS_CPUTIME_ID", CLOCK_PROCESS_CPUTIME_ID);
+ check_resolution("CLOCK_THREAD_CPUTIME_ID", CLOCK_THREAD_CPUTIME_ID);
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, clock_gettime_real);
ATF_TP_ADD_TC(tp, clock_gettime_process_cputime_is_monotonic);
ATF_TP_ADD_TC(tp, clock_gettime_thread_cputime_is_monotonic);
+ ATF_TP_ADD_TC(tp, clock_getres);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_clone.c b/lib/libc/sys/t_clone.c
index d21140132f75..7e359510e2f3 100644
--- a/lib/libc/sys/t_clone.c
+++ b/lib/libc/sys/t_clone.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_clone.c,v 1.4 2017/05/23 15:56:55 christos Exp $ */
+/* $NetBSD: t_clone.c,v 1.6 2024/09/27 18:50:01 riastradh Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -32,11 +32,12 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_clone.c,v 1.4 2017/05/23 15:56:55 christos Exp $");
+__RCSID("$NetBSD: t_clone.c,v 1.6 2024/09/27 18:50:01 riastradh Exp $");
+#include <sys/param.h>
+#include <sys/types.h>
#include <sys/mman.h>
#include <sys/resource.h>
-#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>
@@ -53,6 +54,27 @@ __RCSID("$NetBSD: t_clone.c,v 1.4 2017/05/23 15:56:55 christos Exp $");
#define FROBVAL 41973
#define CHILDEXIT 0xa5
+static void *
+getstack(void)
+{
+ void *stack = mmap(NULL, STACKSIZE, PROT_READ|PROT_WRITE,
+ MAP_PRIVATE|MAP_ANON, -1, (off_t) 0);
+ ATF_REQUIRE_ERRNO(errno, stack != MAP_FAILED);
+#ifndef __MACHINE_STACK_GROWS_UP
+ stack = (char *)stack + STACKSIZE;
+#endif
+ return stack;
+}
+
+static void
+putstack(void *stack)
+{
+#ifndef __MACHINE_STACK_GROWS_UP
+ stack = (char *)stack - STACKSIZE;
+#endif
+ ATF_REQUIRE_ERRNO(errno, munmap(stack, STACKSIZE) != -1);
+}
+
static int
dummy(void *arg)
{
@@ -94,21 +116,11 @@ ATF_TC_HEAD(clone_basic, tc)
ATF_TC_BODY(clone_basic, tc)
{
sigset_t mask;
- void *allocstack, *stack;
+ void *stack = getstack();
pid_t pid;
volatile long frobme[2];
int stat;
- allocstack = mmap(NULL, STACKSIZE, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANON, -1, (off_t) 0);
-
- ATF_REQUIRE_ERRNO(errno, allocstack != MAP_FAILED);
-
- stack = allocstack;
-#ifndef __MACHINE_STACK_GROWS_UP
- stack = (char *)stack + STACKSIZE;
-#endif
-
printf("parent: stack = %p, frobme = %p\n", stack, frobme);
fflush(stdout);
@@ -158,7 +170,7 @@ ATF_TC_BODY(clone_basic, tc)
/*NOTREACHED*/
}
- ATF_REQUIRE_ERRNO(errno, munmap(allocstack, STACKSIZE) != -1);
+ putstack(stack);
}
ATF_TC(clone_null_stack);
@@ -190,16 +202,9 @@ ATF_TC_HEAD(clone_null_func, tc)
ATF_TC_BODY(clone_null_func, tc)
{
- void *allocstack, *stack;
+ void *stack = getstack();
int rv;
- allocstack = mmap(NULL, STACKSIZE, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANON, -1, (off_t) 0);
- ATF_REQUIRE_ERRNO(errno, allocstack != MAP_FAILED);
- stack = allocstack;
-#ifndef __MACHINE_STACK_GROWS_UP
- stack = (char *)stack + STACKSIZE;
-#endif
errno = 0;
rv = __clone(0, stack,
@@ -208,7 +213,7 @@ ATF_TC_BODY(clone_null_func, tc)
ATF_REQUIRE_EQ(rv, -1);
ATF_REQUIRE_EQ(errno, EINVAL);
- ATF_REQUIRE_ERRNO(errno, munmap(allocstack, STACKSIZE) != -1);
+ putstack(stack);
}
ATF_TC(clone_out_of_proc);
@@ -222,6 +227,7 @@ ATF_TC_HEAD(clone_out_of_proc, tc)
ATF_TC_BODY(clone_out_of_proc, tc)
{
+ char *stack = getstack();
struct rlimit rl;
int rv;
@@ -233,11 +239,12 @@ ATF_TC_BODY(clone_out_of_proc, tc)
ATF_REQUIRE_ERRNO(errno, setrlimit(RLIMIT_NPROC, &rl) != -1);
errno = 0;
- rv = __clone(dummy, malloc(10240),
+ rv = __clone(dummy, stack,
CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|SIGCHLD, (void *)&rl);
ATF_REQUIRE_EQ(rv, -1);
ATF_REQUIRE_EQ(errno, EAGAIN);
+ putstack(stack);
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libc/sys/t_dup.c b/lib/libc/sys/t_dup.c
index 93ad718c5497..219904a6779b 100644
--- a/lib/libc/sys/t_dup.c
+++ b/lib/libc/sys/t_dup.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_dup.c,v 1.9 2017/01/13 20:31:53 christos Exp $ */
+/* $NetBSD: t_dup.c,v 1.10 2024/05/20 00:27:53 christos Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_dup.c,v 1.9 2017/01/13 20:31:53 christos Exp $");
+__RCSID("$NetBSD: t_dup.c,v 1.10 2024/05/20 00:27:53 christos Exp $");
#include <sys/resource.h>
#include <sys/stat.h>
@@ -208,10 +208,10 @@ ATF_TC_BODY(dup3_err, tc)
ATF_REQUIRE(fd >= 0);
errno = 0;
- ATF_REQUIRE(dup3(fd, fd, O_CLOEXEC) != -1);
+ ATF_REQUIRE_ERRNO(EINVAL, dup3(fd, fd, O_CLOEXEC) == -1);
errno = 0;
- ATF_REQUIRE_ERRNO(EBADF, dup3(-1, -1, O_CLOEXEC) == -1);
+ ATF_REQUIRE_ERRNO(EINVAL, dup3(-1, -1, O_CLOEXEC) == -1);
errno = 0;
ATF_REQUIRE_ERRNO(EBADF, dup3(fd, -1, O_CLOEXEC) == -1);
diff --git a/lib/libc/sys/t_futex_ops.c b/lib/libc/sys/t_futex_ops.c
index 2941d4e2b6c6..03dd66dbab05 100644
--- a/lib/libc/sys/t_futex_ops.c
+++ b/lib/libc/sys/t_futex_ops.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_futex_ops.c,v 1.5 2020/05/06 05:14:27 thorpej Exp $ */
+/* $NetBSD: t_futex_ops.c,v 1.14 2025/03/05 12:02:00 riastradh Exp $ */
/*-
* Copyright (c) 2019, 2020 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2019, 2020\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_futex_ops.c,v 1.5 2020/05/06 05:14:27 thorpej Exp $");
+__RCSID("$NetBSD: t_futex_ops.c,v 1.14 2025/03/05 12:02:00 riastradh Exp $");
#include <sys/fcntl.h>
#include <sys/mman.h>
@@ -49,6 +49,8 @@ __RCSID("$NetBSD: t_futex_ops.c,v 1.5 2020/05/06 05:14:27 thorpej Exp $");
#include <libc/include/futex_private.h>
+#include "h_macros.h"
+
#define LOAD(x) (*(volatile int *)(x))
#define STORE(x, y) *(volatile int *)(x) = (y)
@@ -104,7 +106,7 @@ static long bs_pagesize;
static void
create_lwp_waiter(struct lwp_data *d)
{
- ATF_REQUIRE(_lwp_create(&d->context, 0, &d->lwpid) == 0);
+ RL(_lwp_create(&d->context, 0, &d->lwpid));
}
static void
@@ -116,7 +118,7 @@ exit_lwp_waiter(void)
static void
reap_lwp_waiter(struct lwp_data *d)
{
- ATF_REQUIRE(_lwp_wait(d->lwpid, NULL) == 0);
+ RL(_lwp_wait(d->lwpid, NULL));
}
static void
@@ -124,7 +126,7 @@ create_proc_waiter(struct lwp_data *d)
{
pid_t pid;
- ATF_REQUIRE((pid = fork()) != -1);
+ RL(pid = fork());
if (pid == 0) {
(*d->func)(d);
_exit(666); /* backstop */
@@ -141,11 +143,14 @@ exit_proc_waiter(void)
static void
reap_proc_waiter(struct lwp_data *d)
{
+ pid_t pid;
int status;
- ATF_REQUIRE(waitpid(d->child, &status, 0) == d->child);
- ATF_REQUIRE(WIFEXITED(status));
- ATF_REQUIRE(WEXITSTATUS(status) == 0);
+ RL(pid = waitpid(d->child, &status, 0));
+ ATF_CHECK_EQ_MSG(pid, d->child,
+ "pid=%lld d->child=%lld", (long long)pid, (long long)d->child);
+ ATF_CHECK_MSG(WIFEXITED(status), "status=0x%x", status);
+ ATF_CHECK_EQ_MSG(WEXITSTATUS(status), 0, "status=0x%x", status);
}
static void
@@ -153,10 +158,12 @@ setup_lwp_context(struct lwp_data *d, void (*func)(void *))
{
memset(d, 0, sizeof(*d));
- d->stack_base = mmap(NULL, STACK_SIZE, PROT_READ | PROT_WRITE,
- MAP_ANON | MAP_STACK | MAP_PRIVATE, -1, 0);
- ATF_REQUIRE(d->stack_base != MAP_FAILED);
- _lwp_makecontext(&d->context, func, d, NULL, d->stack_base, STACK_SIZE);
+ REQUIRE_LIBC(d->stack_base = mmap(NULL, STACK_SIZE,
+ PROT_READ | PROT_WRITE, MAP_ANON | MAP_STACK | MAP_PRIVATE,
+ -1, 0),
+ MAP_FAILED);
+ _lwp_makecontext(&d->context, func, d, NULL, d->stack_base,
+ STACK_SIZE);
d->threadid = 0;
d->func = func;
}
@@ -173,7 +180,7 @@ simple_test_waiter_lwp(void *arg)
membar_sync();
if (__futex(d->futex_ptr, d->wait_op | d->op_flags,
- d->block_val, NULL, NULL, 0, d->bitset) == -1) {
+ d->block_val, NULL, NULL, 0, d->bitset) == -1) {
d->futex_error = errno;
membar_sync();
atomic_dec_uint(&nlwps_running);
@@ -191,14 +198,15 @@ simple_test_waiter_lwp(void *arg)
static bool
verify_zero_bs(void)
{
+ ssize_t nread;
if (bs_verify_buffer == NULL) {
- bs_verify_buffer = malloc(bs_pagesize);
- ATF_REQUIRE(bs_verify_buffer != NULL);
+ REQUIRE_LIBC(bs_verify_buffer = malloc(bs_pagesize), NULL);
}
- ATF_REQUIRE(pread(bs_fd, bs_verify_buffer,
- bs_pagesize, 0) == bs_pagesize);
+ RL(nread = pread(bs_fd, bs_verify_buffer, bs_pagesize, 0));
+ ATF_REQUIRE_EQ_MSG(nread, bs_pagesize, "nread=%zu bs_pagesize=%lu",
+ nread, bs_pagesize);
return (memcmp(bs_verify_buffer, bs_source_buffer, bs_pagesize) == 0);
}
@@ -206,25 +214,24 @@ verify_zero_bs(void)
static void
create_bs(int map_flags)
{
+ ssize_t nwrit;
bs_pagesize = sysconf(_SC_PAGESIZE);
- ATF_REQUIRE(bs_pagesize > 0);
+ ATF_REQUIRE_MSG(bs_pagesize > 0, "bs_pagesize=%ld", bs_pagesize);
if ((map_flags & (MAP_FILE | MAP_ANON)) == MAP_FILE) {
- bs_source_buffer = calloc(1, bs_pagesize);
- ATF_REQUIRE(bs_source_buffer != NULL);
+ REQUIRE_LIBC(bs_source_buffer = calloc(1, bs_pagesize), NULL);
- bs_fd = open(bs_path, O_RDWR | O_CREAT | O_EXCL, 0644);
- ATF_REQUIRE(bs_fd != -1);
-
- ATF_REQUIRE(pwrite(bs_fd, bs_source_buffer,
- bs_pagesize, 0) == bs_pagesize);
+ RL(bs_fd = open(bs_path, O_RDWR | O_CREAT | O_EXCL, 0644));
+ RL(nwrit = pwrite(bs_fd, bs_source_buffer, bs_pagesize, 0));
+ ATF_REQUIRE_EQ_MSG(nwrit, bs_pagesize,
+ "nwrit=%zu bs_pagesize=%lu", nwrit, bs_pagesize);
ATF_REQUIRE(verify_zero_bs());
}
- bs_addr = mmap(NULL, bs_pagesize, PROT_READ | PROT_WRITE,
- map_flags | MAP_HASSEMAPHORE, bs_fd, 0);
- ATF_REQUIRE(bs_addr != MAP_FAILED);
+ REQUIRE_LIBC(bs_addr = mmap(NULL, bs_pagesize, PROT_READ | PROT_WRITE,
+ map_flags | MAP_HASSEMAPHORE, bs_fd, 0),
+ MAP_FAILED);
}
static void
@@ -283,7 +290,7 @@ wait_wake_test_waiter_lwp(void *arg)
/* This will block because *futex_ptr == 1. */
if (__futex(d->futex_ptr, FUTEX_WAIT | d->op_flags,
- 1, NULL, NULL, 0, 0) == -1) {
+ 1, NULL, NULL, 0, 0) == -1) {
STORE(d->error_ptr, errno);
(*d->exit_func)();
} else {
@@ -305,7 +312,7 @@ wait_wake_test_waiter_lwp(void *arg)
/* This will not block because futex_word != 666. */
if (__futex(d->futex_ptr, FUTEX_WAIT | d->op_flags,
- 666, NULL, NULL, 0, 0) == -1) {
+ 666, NULL, NULL, 0, 0) == -1) {
/* This SHOULD be EAGAIN. */
STORE(d->error_ptr, errno);
}
@@ -318,13 +325,14 @@ wait_wake_test_waiter_lwp(void *arg)
static void
do_futex_wait_wake_test(volatile int *futex_ptr, volatile int *error_ptr,
- void (*create_func)(struct lwp_data *),
- void (*exit_func)(void),
- void (*reap_func)(struct lwp_data *),
- int flags)
+ void (*create_func)(struct lwp_data *),
+ void (*exit_func)(void),
+ void (*reap_func)(struct lwp_data *),
+ int flags)
{
struct lwp_data *wlwp = &lwp_data[WAITER_LWP0];
int tries;
+ int n;
if (error_ptr == NULL)
error_ptr = &wlwp->futex_error;
@@ -359,7 +367,7 @@ do_futex_wait_wake_test(volatile int *futex_ptr, volatile int *error_ptr,
sleep(1);
}
membar_sync();
- ATF_REQUIRE(LOAD(futex_ptr) == 1);
+ ATF_REQUIRE_EQ_MSG((n = LOAD(futex_ptr)), 1, "LOAD(futex_ptr)=%d", n);
/*
* If the LWP is blocked in the futex, it will not have yet
@@ -374,16 +382,16 @@ do_futex_wait_wake_test(volatile int *futex_ptr, volatile int *error_ptr,
sleep(1);
}
membar_sync();
- ATF_REQUIRE(LOAD(error_ptr) == -1);
+ ATF_REQUIRE_EQ_MSG((n = LOAD(error_ptr)), -1, "error=%d", n);
/* Make sure invalid #wakes in rejected. */
ATF_REQUIRE_ERRNO(EINVAL,
__futex(futex_ptr, FUTEX_WAKE | flags,
- -1, NULL, NULL, 0, 0) == -1);
+ -1, NULL, NULL, 0, 0) == -1);
DPRINTF(("futex_basic_wait_wake: waking 1 waiter\n"));
- ATF_REQUIRE(__futex(futex_ptr, FUTEX_WAKE | flags,
- 1, NULL, NULL, 0, 0) == 1);
+ RL(n = __futex(futex_ptr, FUTEX_WAKE | flags, 1, NULL, NULL, 0, 0));
+ ATF_REQUIRE_EQ_MSG(n, 1, "n=%d wakeups", n);
DPRINTF(("futex_basic_wait_wake: checking for successful wake (%d)\n",
LOAD(error_ptr)));
@@ -394,7 +402,7 @@ do_futex_wait_wake_test(volatile int *futex_ptr, volatile int *error_ptr,
sleep(1);
}
membar_sync();
- ATF_REQUIRE(LOAD(error_ptr) == 0);
+ ATF_REQUIRE_EQ_MSG((n = LOAD(error_ptr)), 0, "error=%d", n);
STORE(futex_ptr, 0);
membar_sync();
@@ -407,7 +415,7 @@ do_futex_wait_wake_test(volatile int *futex_ptr, volatile int *error_ptr,
sleep(1);
}
membar_sync();
- ATF_REQUIRE(LOAD(futex_ptr) == 2);
+ ATF_REQUIRE_EQ_MSG((n = LOAD(futex_ptr)), 2, "LOAD(futex_ptr)=%d", n);
STORE(futex_ptr, 3);
membar_sync();
@@ -420,10 +428,10 @@ do_futex_wait_wake_test(volatile int *futex_ptr, volatile int *error_ptr,
sleep(1);
}
membar_sync();
- ATF_REQUIRE(LOAD(futex_ptr) == 4);
+ ATF_REQUIRE_EQ_MSG((n = LOAD(futex_ptr)), 4, "error=%d", n);
DPRINTF(("futex_basic_wait_wake: checking for expected EGAIN\n"));
- ATF_REQUIRE(LOAD(error_ptr) == EAGAIN);
+ ATF_REQUIRE_EQ_MSG((n = LOAD(error_ptr)), EAGAIN, "error=%d", n);
DPRINTF(("futex_basic_wait_wake: reaping LWP %d\n", wlwp->lwpid));
(*reap_func)(wlwp);
@@ -438,8 +446,8 @@ ATF_TC_HEAD(futex_basic_wait_wake_private, tc)
ATF_TC_BODY(futex_basic_wait_wake_private, tc)
{
do_futex_wait_wake_test(&futex_word, NULL,
- NULL, NULL, NULL,
- FUTEX_PRIVATE_FLAG);
+ NULL, NULL, NULL,
+ FUTEX_PRIVATE_FLAG);
}
ATF_TC_CLEANUP(futex_basic_wait_wake_private, tc)
{
@@ -455,8 +463,8 @@ ATF_TC_HEAD(futex_basic_wait_wake_shared, tc)
ATF_TC_BODY(futex_basic_wait_wake_shared, tc)
{
do_futex_wait_wake_test(&futex_word, NULL,
- NULL, NULL, NULL,
- 0);
+ NULL, NULL, NULL,
+ 0);
}
ATF_TC_CLEANUP(futex_basic_wait_wake_shared, tc)
{
@@ -473,8 +481,8 @@ ATF_TC_BODY(futex_wait_wake_anon_bs_private, tc)
{
create_bs(MAP_ANON | MAP_PRIVATE);
do_futex_wait_wake_test(&bs_addr[0], NULL,
- NULL, NULL, NULL,
- FUTEX_PRIVATE_FLAG);
+ NULL, NULL, NULL,
+ FUTEX_PRIVATE_FLAG);
}
ATF_TC_CLEANUP(futex_wait_wake_anon_bs_private, tc)
{
@@ -491,8 +499,8 @@ ATF_TC_BODY(futex_wait_wake_anon_bs_shared, tc)
{
create_bs(MAP_ANON | MAP_PRIVATE);
do_futex_wait_wake_test(&bs_addr[0], NULL,
- NULL, NULL, NULL,
- 0);
+ NULL, NULL, NULL,
+ 0);
}
ATF_TC_CLEANUP(futex_wait_wake_anon_bs_shared, tc)
{
@@ -514,9 +522,9 @@ ATF_TC_BODY(futex_wait_wake_file_bs_private, tc)
*/
create_bs(MAP_FILE | MAP_SHARED);
do_futex_wait_wake_test(&bs_addr[0], NULL,
- NULL, NULL, NULL,
- FUTEX_PRIVATE_FLAG);
- ATF_REQUIRE(! verify_zero_bs());
+ NULL, NULL, NULL,
+ FUTEX_PRIVATE_FLAG);
+ ATF_REQUIRE(!verify_zero_bs());
}
ATF_TC_CLEANUP(futex_wait_wake_file_bs_private, tc)
{
@@ -533,8 +541,8 @@ ATF_TC_BODY(futex_wait_wake_file_bs_cow_private, tc)
{
create_bs(MAP_FILE | MAP_PRIVATE);
do_futex_wait_wake_test(&bs_addr[0], NULL,
- NULL, NULL, NULL,
- FUTEX_PRIVATE_FLAG);
+ NULL, NULL, NULL,
+ FUTEX_PRIVATE_FLAG);
ATF_REQUIRE(verify_zero_bs());
}
ATF_TC_CLEANUP(futex_wait_wake_file_bs_cow_private, tc)
@@ -552,9 +560,9 @@ ATF_TC_BODY(futex_wait_wake_file_bs_shared, tc)
{
create_bs(MAP_FILE | MAP_SHARED);
do_futex_wait_wake_test(&bs_addr[0], NULL,
- NULL, NULL, NULL,
- 0);
- ATF_REQUIRE(! verify_zero_bs());
+ NULL, NULL, NULL,
+ 0);
+ ATF_REQUIRE(!verify_zero_bs());
}
ATF_TC_CLEANUP(futex_wait_wake_file_bs_shared, tc)
{
@@ -576,8 +584,8 @@ ATF_TC_BODY(futex_wait_wake_file_bs_cow_shared, tc)
*/
create_bs(MAP_FILE | MAP_PRIVATE);
do_futex_wait_wake_test(&bs_addr[0], NULL,
- NULL, NULL, NULL,
- 0);
+ NULL, NULL, NULL,
+ 0);
ATF_REQUIRE(verify_zero_bs());
}
ATF_TC_CLEANUP(futex_wait_wake_file_bs_cow_shared, tc)
@@ -595,10 +603,10 @@ ATF_TC_BODY(futex_wait_wake_anon_bs_shared_proc, tc)
{
create_bs(MAP_ANON | MAP_SHARED);
do_futex_wait_wake_test(&bs_addr[0], &bs_addr[1],
- create_proc_waiter,
- exit_proc_waiter,
- reap_proc_waiter,
- 0);
+ create_proc_waiter,
+ exit_proc_waiter,
+ reap_proc_waiter,
+ 0);
}
ATF_TC_CLEANUP(futex_wait_wake_anon_bs_shared_proc, tc)
{
@@ -615,10 +623,10 @@ ATF_TC_BODY(futex_wait_wake_file_bs_shared_proc, tc)
{
create_bs(MAP_FILE | MAP_SHARED);
do_futex_wait_wake_test(&bs_addr[0], &bs_addr[1],
- create_proc_waiter,
- exit_proc_waiter,
- reap_proc_waiter,
- 0);
+ create_proc_waiter,
+ exit_proc_waiter,
+ reap_proc_waiter,
+ 0);
}
ATF_TC_CLEANUP(futex_wait_wake_file_bs_shared_proc, tc)
{
@@ -647,7 +655,7 @@ do_futex_wait_wake_bitset_test(int flags)
{
struct lwp_data *wlwp0 = &lwp_data[WAITER_LWP0];
struct lwp_data *wlwp1 = &lwp_data[WAITER_LWP1];
- int i, tries;
+ int i, tries, n;
for (i = WAITER_LWP0; i <= WAITER_LWP1; i++) {
setup_lwp_context(&lwp_data[i], simple_test_waiter_lwp);
@@ -662,8 +670,8 @@ do_futex_wait_wake_bitset_test(int flags)
STORE(&futex_word, 1);
membar_sync();
- ATF_REQUIRE(_lwp_create(&wlwp0->context, 0, &wlwp0->lwpid) == 0);
- ATF_REQUIRE(_lwp_create(&wlwp1->context, 0, &wlwp1->lwpid) == 0);
+ RL(_lwp_create(&wlwp0->context, 0, &wlwp0->lwpid));
+ RL(_lwp_create(&wlwp1->context, 0, &wlwp1->lwpid));
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -672,25 +680,30 @@ do_futex_wait_wake_bitset_test(int flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 2, "waiters failed to start");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 2,
+ "waiters failed to start, nlwps_running=%u", nlwps_running);
/* Ensure they're blocked. */
- ATF_REQUIRE(wlwp0->futex_error == -1);
- ATF_REQUIRE(wlwp1->futex_error == -1);
+ ATF_REQUIRE_EQ_MSG(wlwp0->futex_error, -1, "wlwp0->futex_error=%d",
+ wlwp0->futex_error);
+ ATF_REQUIRE_EQ_MSG(wlwp1->futex_error, -1, "wlwp1->futex_error=%d",
+ wlwp1->futex_error);
/* Make sure invalid #wakes in rejected. */
ATF_REQUIRE_ERRNO(EINVAL,
__futex(&futex_word, FUTEX_WAKE_BITSET | flags,
- -1, NULL, NULL, 0, 0) == -1);
+ -1, NULL, NULL, 0, 0) == -1);
/* This should result in no wakeups because no bits are set. */
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_BITSET | flags,
- INT_MAX, NULL, NULL, 0, 0) == 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_BITSET | flags,
+ INT_MAX, NULL, NULL, 0, 0));
+ ATF_REQUIRE_EQ_MSG(n, 0, "n=%d wakeups", n);
/* This should result in no wakeups because the wrongs bits are set. */
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_BITSET | flags,
- INT_MAX, NULL, NULL, 0,
- ~(wlwp0->bitset | wlwp1->bitset)) == 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_BITSET | flags,
+ INT_MAX, NULL, NULL, 0,
+ ~(wlwp0->bitset | wlwp1->bitset)));
+ ATF_REQUIRE_EQ_MSG(n, 0, "n=%d wakeups", n);
/* Trust, but verify. */
sleep(1);
@@ -701,12 +714,13 @@ do_futex_wait_wake_bitset_test(int flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 2, "waiters exited unexpectedly");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 2,
+ "waiters exited unexpectedly, nlwps_running=%u", nlwps_running);
/* Wake up the first LWP. */
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_BITSET | flags,
- INT_MAX, NULL, NULL, 0,
- wlwp0->bitset) == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_BITSET | flags,
+ INT_MAX, NULL, NULL, 0, wlwp0->bitset));
+ ATF_REQUIRE_EQ_MSG(n, 1, "n=%d wakeups", n);
sleep(1);
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -715,14 +729,16 @@ do_futex_wait_wake_bitset_test(int flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE(nlwps_running == 1);
- ATF_REQUIRE(wlwp0->futex_error == 0);
- ATF_REQUIRE(_lwp_wait(wlwp0->lwpid, NULL) == 0);
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 1, "nlwps_running=%u",
+ nlwps_running);
+ ATF_REQUIRE_EQ_MSG(wlwp0->futex_error, 0, "wlwp0->futex_error=%d",
+ wlwp0->futex_error);
+ RL(_lwp_wait(wlwp0->lwpid, NULL));
/* Wake up the second LWP. */
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_BITSET | flags,
- INT_MAX, NULL, NULL, 0,
- wlwp1->bitset) == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_BITSET | flags,
+ INT_MAX, NULL, NULL, 0, wlwp1->bitset));
+ ATF_REQUIRE_EQ_MSG(n, 1, "n=%d wakeups", n);
sleep(1);
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -731,9 +747,11 @@ do_futex_wait_wake_bitset_test(int flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE(nlwps_running == 0);
- ATF_REQUIRE(wlwp1->futex_error == 0);
- ATF_REQUIRE(_lwp_wait(wlwp1->lwpid, NULL) == 0);
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 0, "nlwps_running=%u",
+ nlwps_running);
+ ATF_REQUIRE_EQ_MSG(wlwp1->futex_error, 0, "wlwp1->futex_error=%d",
+ wlwp1->futex_error);
+ RL(_lwp_wait(wlwp1->lwpid, NULL));
}
ATF_TC_WITH_CLEANUP(futex_wait_wake_bitset);
@@ -762,7 +780,7 @@ do_futex_requeue_test(int flags, int op)
struct lwp_data *wlwp3 = &lwp_data[WAITER_LWP3];
const int good_val3 = (op == FUTEX_CMP_REQUEUE) ? 1 : 0;
const int bad_val3 = (op == FUTEX_CMP_REQUEUE) ? 666 : 0;
- int i, tries;
+ int i, tries, n;
for (i = WAITER_LWP0; i <= WAITER_LWP3; i++) {
setup_lwp_context(&lwp_data[i], simple_test_waiter_lwp);
@@ -778,10 +796,10 @@ do_futex_requeue_test(int flags, int op)
STORE(&futex_word1, 1);
membar_sync();
- ATF_REQUIRE(_lwp_create(&wlwp0->context, 0, &wlwp0->lwpid) == 0);
- ATF_REQUIRE(_lwp_create(&wlwp1->context, 0, &wlwp1->lwpid) == 0);
- ATF_REQUIRE(_lwp_create(&wlwp2->context, 0, &wlwp2->lwpid) == 0);
- ATF_REQUIRE(_lwp_create(&wlwp3->context, 0, &wlwp3->lwpid) == 0);
+ RL(_lwp_create(&wlwp0->context, 0, &wlwp0->lwpid));
+ RL(_lwp_create(&wlwp1->context, 0, &wlwp1->lwpid));
+ RL(_lwp_create(&wlwp2->context, 0, &wlwp2->lwpid));
+ RL(_lwp_create(&wlwp3->context, 0, &wlwp3->lwpid));
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -790,22 +808,27 @@ do_futex_requeue_test(int flags, int op)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 4, "waiters failed to start");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 4,
+ "waiters failed to start, nlwps_running=%u", nlwps_running);
/* Ensure they're blocked. */
- ATF_REQUIRE(wlwp0->futex_error == -1);
- ATF_REQUIRE(wlwp1->futex_error == -1);
- ATF_REQUIRE(wlwp2->futex_error == -1);
- ATF_REQUIRE(wlwp3->futex_error == -1);
+ ATF_REQUIRE_EQ_MSG(wlwp0->futex_error, -1, "wlwp0->futex_error=%d",
+ wlwp0->futex_error);
+ ATF_REQUIRE_EQ_MSG(wlwp1->futex_error, -1, "wlwp1->futex_error=%d",
+ wlwp1->futex_error);
+ ATF_REQUIRE_EQ_MSG(wlwp2->futex_error, -1, "wlwp2->futex_error=%d",
+ wlwp2->futex_error);
+ ATF_REQUIRE_EQ_MSG(wlwp3->futex_error, -1, "wlwp3->futex_error=%d",
+ wlwp3->futex_error);
/* Make sure invalid #wakes and #requeues are rejected. */
ATF_REQUIRE_ERRNO(EINVAL,
__futex(&futex_word, op | flags,
- -1, NULL, &futex_word1, INT_MAX, bad_val3) == -1);
+ -1, NULL, &futex_word1, INT_MAX, bad_val3) == -1);
ATF_REQUIRE_ERRNO(EINVAL,
__futex(&futex_word, op | flags,
- 0, NULL, &futex_word1, -1, bad_val3) == -1);
+ 0, NULL, &futex_word1, -1, bad_val3) == -1);
/*
* FUTEX 0: 4 LWPs
@@ -816,7 +839,7 @@ do_futex_requeue_test(int flags, int op)
/* This should fail because the futex_word value is 1. */
ATF_REQUIRE_ERRNO(EAGAIN,
__futex(&futex_word, op | flags,
- 0, NULL, &futex_word1, INT_MAX, bad_val3) == -1);
+ 0, NULL, &futex_word1, INT_MAX, bad_val3) == -1);
}
/*
@@ -825,8 +848,9 @@ do_futex_requeue_test(int flags, int op)
*/
/* Move all waiters from 0 to 1. */
- ATF_REQUIRE(__futex(&futex_word, op | flags,
- 0, NULL, &futex_word1, INT_MAX, good_val3) == 0);
+ RL(n = __futex(&futex_word, op | flags, 0, NULL, &futex_word1,
+ INT_MAX, good_val3));
+ ATF_CHECK_EQ_MSG(n, 4, "n=%d woken or requeued", n);
/*
* FUTEX 0: 0 LWPs
@@ -837,7 +861,7 @@ do_futex_requeue_test(int flags, int op)
/* This should fail because the futex_word1 value is 1. */
ATF_REQUIRE_ERRNO(EAGAIN,
__futex(&futex_word1, op | flags,
- 1, NULL, &futex_word, 1, bad_val3) == -1);
+ 1, NULL, &futex_word, 1, bad_val3) == -1);
}
/*
@@ -846,8 +870,9 @@ do_futex_requeue_test(int flags, int op)
*/
/* Wake one waiter on 1, move one waiter to 0. */
- ATF_REQUIRE(__futex(&futex_word1, op | flags,
- 1, NULL, &futex_word, 1, good_val3) == 1);
+ RL(n = __futex(&futex_word1, op | flags, 1, NULL, &futex_word,
+ 1, good_val3));
+ ATF_CHECK_EQ_MSG(n, 2, "n=%d woken or requeued", n);
/*
* FUTEX 0: 1 LWP
@@ -855,12 +880,14 @@ do_futex_requeue_test(int flags, int op)
*/
/* Wake all waiters on 0 (should be 1). */
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE | flags,
- INT_MAX, NULL, NULL, 0, 0) == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE | flags, INT_MAX, NULL, NULL,
+ 0, 0));
+ ATF_CHECK_EQ_MSG(n, 1, "n=%d woken", n);
/* Wake all waiters on 1 (should be 2). */
- ATF_REQUIRE(__futex(&futex_word1, FUTEX_WAKE | flags,
- INT_MAX, NULL, NULL, 0, 0) == 2);
+ RL(n = __futex(&futex_word1, FUTEX_WAKE | flags, INT_MAX, NULL, NULL,
+ 0, 0));
+ ATF_CHECK_EQ_MSG(n, 2, "n=%d woken", n);
/* Trust, but verify. */
sleep(1);
@@ -871,12 +898,13 @@ do_futex_requeue_test(int flags, int op)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 0, "waiters failed to exit");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 0,
+ "waiters failed to exit, nlwps_running=%u", nlwps_running);
- ATF_REQUIRE(_lwp_wait(wlwp0->lwpid, NULL) == 0);
- ATF_REQUIRE(_lwp_wait(wlwp1->lwpid, NULL) == 0);
- ATF_REQUIRE(_lwp_wait(wlwp2->lwpid, NULL) == 0);
- ATF_REQUIRE(_lwp_wait(wlwp3->lwpid, NULL) == 0);
+ RL(_lwp_wait(wlwp0->lwpid, NULL));
+ RL(_lwp_wait(wlwp1->lwpid, NULL));
+ RL(_lwp_wait(wlwp2->lwpid, NULL));
+ RL(_lwp_wait(wlwp3->lwpid, NULL));
}
ATF_TC_WITH_CLEANUP(futex_requeue);
@@ -909,12 +937,36 @@ ATF_TC_CLEANUP(futex_cmp_requeue, tc)
do_cleanup();
}
+ATF_TC(futex_cmp_requeue_trivial);
+ATF_TC_HEAD(futex_cmp_requeue_trivial, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "tests trivial cases of futex CMP_REQUEUE operations");
+}
+ATF_TC_BODY(futex_cmp_requeue_trivial, tc)
+{
+ int nwoken;
+
+ futex_word = 123;
+ futex_word1 = 456; /* should be ignored */
+ ATF_CHECK_ERRNO(EAGAIN, __futex(&futex_word, FUTEX_CMP_REQUEUE,
+ /*nwake*/1, NULL, &futex_word1, /*nrequeue*/1, 0) == -1);
+ ATF_CHECK_ERRNO(EAGAIN, __futex(&futex_word, FUTEX_CMP_REQUEUE,
+ /*nwake*/1, NULL, &futex_word1, /*nrequeue*/1, 122) == -1);
+ nwoken = __futex(&futex_word, FUTEX_CMP_REQUEUE,
+ /*nwake*/1, NULL, &futex_word1, /*nrequeue*/1, 123);
+ ATF_CHECK_MSG(nwoken != -1, "errno=%d (%s)", errno, strerror(errno));
+ ATF_CHECK_EQ_MSG(nwoken, 0, "nwoken=%d", nwoken);
+ ATF_CHECK_EQ_MSG(futex_word, 123, "futex_word=%d", futex_word);
+ ATF_CHECK_EQ_MSG(futex_word1, 456, "futex_word1=%d", futex_word1);
+}
+
/*****************************************************************************/
static void
do_futex_wake_op_op_test(int flags)
{
- int op;
+ int op, n;
futex_word = 0;
futex_word1 = 0;
@@ -928,61 +980,85 @@ do_futex_wake_op_op_test(int flags)
* rejecting unaligned futex addresses here.
*/
op = FUTEX_OP(FUTEX_OP_SET, 1, FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE_ERRNO(EINVAL,
+ ATF_CHECK_ERRNO(EINVAL,
__futex((int *)1, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == -1);
- ATF_REQUIRE(futex_word1 == 0);
+ 0, NULL, &futex_word1, 0, op) == -1);
+ ATF_CHECK_EQ_MSG(futex_word1, 0, "futex_word1=%d", futex_word1);
- ATF_REQUIRE_ERRNO(EINVAL,
+ ATF_CHECK_ERRNO(EINVAL,
__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, (int *)1, 0, op) == -1);
- ATF_REQUIRE(futex_word == 0);
+ 0, NULL, (int *)1, 0, op) == -1);
+ ATF_CHECK_EQ_MSG(futex_word, 0, "futex_word=%d", futex_word);
/* Check unmapped uaddr2 handling, too. */
- ATF_REQUIRE_ERRNO(EFAULT,
+ ATF_CHECK_ERRNO(EFAULT,
__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, NULL, 0, op) == -1);
- ATF_REQUIRE(futex_word == 0);
+ 0, NULL, NULL, 0, op) == -1);
+ ATF_CHECK_EQ_MSG(futex_word, 0, "futex_word=%d", futex_word);
op = FUTEX_OP(FUTEX_OP_SET, 1, FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == 0);
- ATF_REQUIRE(futex_word1 == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 1, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_ADD, 1, FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == 0);
- ATF_REQUIRE(futex_word1 == 2);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_OR, 2, FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == 0);
- ATF_REQUIRE(futex_word1 == 2);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
/* This should fail because of invalid shift value 32. */
op = FUTEX_OP(FUTEX_OP_OR | FUTEX_OP_OPARG_SHIFT, 32,
- FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE_ERRNO(EINVAL,
+ FUTEX_OP_CMP_EQ, 0);
+ ATF_CHECK_ERRNO(EINVAL,
__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == -1);
- ATF_REQUIRE(futex_word1 == 2);
+ 0, NULL, &futex_word1, 0, op) == -1);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_OR | FUTEX_OP_OPARG_SHIFT, 31,
- FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == 0);
- ATF_REQUIRE(futex_word1 == (int)0x80000002);
+ FUTEX_OP_CMP_EQ, 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, (int)0x80000002,
+ "futex_word1=0x%x", futex_word1);
op = FUTEX_OP(FUTEX_OP_ANDN | FUTEX_OP_OPARG_SHIFT, 31,
- FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == 0);
- ATF_REQUIRE(futex_word1 == 2);
+ FUTEX_OP_CMP_EQ, 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_XOR, 2, FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 0, op) == 0);
- ATF_REQUIRE(futex_word1 == 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 0, "futex_word1=%d", futex_word1);
+
+ /*
+ * Verify oparg is sign-extended.
+ */
+ futex_word1 = 0;
+ op = FUTEX_OP(FUTEX_OP_SET, 0xfff, FUTEX_OP_CMP_EQ, 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, -1, "futex_word1=%d", futex_word1);
+
+ futex_word1 = 0;
+ op = FUTEX_OP(FUTEX_OP_SET, -1, FUTEX_OP_CMP_EQ, 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 0, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, -1, "futex_word1=%d", futex_word1);
}
ATF_TC_WITH_CLEANUP(futex_wake_op_op);
@@ -1016,8 +1092,7 @@ create_wake_op_test_lwps(int flags)
lwp_data[i].block_val = 0;
lwp_data[i].bitset = 0;
lwp_data[i].wait_op = FUTEX_WAIT;
- ATF_REQUIRE(_lwp_create(&lwp_data[i].context, 0,
- &lwp_data[i].lwpid) == 0);
+ RL(_lwp_create(&lwp_data[i].context, 0, &lwp_data[i].lwpid));
}
for (i = 0; i < 5; i++) {
@@ -1027,11 +1102,14 @@ create_wake_op_test_lwps(int flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 6, "waiters failed to start");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 6,
+ "waiters failed to start, nlwps_running=%u", nlwps_running);
/* Ensure they're blocked. */
for (i = WAITER_LWP0; i <= WAITER_LWP5; i++) {
- ATF_REQUIRE(lwp_data[i].futex_error == -1);
+ ATF_REQUIRE_EQ_MSG(lwp_data[i].futex_error, -1,
+ "i=%d lwp_data[i].futex_error=%d",
+ i, lwp_data[i].futex_error);
}
}
@@ -1041,14 +1119,14 @@ reap_wake_op_test_lwps(void)
int i;
for (i = WAITER_LWP0; i <= WAITER_LWP5; i++) {
- ATF_REQUIRE(_lwp_wait(lwp_data[i].lwpid, NULL) == 0);
+ RL(_lwp_wait(lwp_data[i].lwpid, NULL));
}
}
static void
do_futex_wake_op_cmp_test(int flags)
{
- int tries, op;
+ int tries, op, n;
futex_word = 0;
membar_sync();
@@ -1061,70 +1139,97 @@ do_futex_wake_op_cmp_test(int flags)
create_wake_op_test_lwps(flags);
/* #LWPs = 6 */
+ futex_word1 = 0xfff;
+ op = FUTEX_OP(FUTEX_OP_SET, 0, FUTEX_OP_CMP_EQ, 0xfff);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 0, "futex_word1=%d", futex_word1);
+
+ futex_word1 = 0xfff;
+ op = FUTEX_OP(FUTEX_OP_SET, 0, FUTEX_OP_CMP_EQ, -1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 0, "futex_word1=%d", futex_word1);
+
op = FUTEX_OP(FUTEX_OP_SET, 0, FUTEX_OP_CMP_EQ, 1);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 0);
- ATF_REQUIRE(futex_word1 == 0);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 0, "futex_word1=%d", futex_word1);
- op = FUTEX_OP(FUTEX_OP_SET, 1, FUTEX_OP_CMP_EQ, 0);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 1);
- ATF_REQUIRE(futex_word1 == 1);
+ futex_word1 = -1;
+ op = FUTEX_OP(FUTEX_OP_SET, 1, FUTEX_OP_CMP_EQ, 0xfff);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 1, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 1, "futex_word1=%d", futex_word1);
/* #LWPs = 5 */
op = FUTEX_OP(FUTEX_OP_SET, 1, FUTEX_OP_CMP_NE, 1);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 0);
- ATF_REQUIRE(futex_word1 == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 1, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_SET, 2, FUTEX_OP_CMP_NE, 2);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 1);
- ATF_REQUIRE(futex_word1 == 2);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 1, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
/* #LWPs = 4 */
op = FUTEX_OP(FUTEX_OP_SET, 2, FUTEX_OP_CMP_LT, 2);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 0);
- ATF_REQUIRE(futex_word1 == 2);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_SET, 2, FUTEX_OP_CMP_LT, 3);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 1);
- ATF_REQUIRE(futex_word1 == 2);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 1, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
/* #LWPs = 3 */
op = FUTEX_OP(FUTEX_OP_SET, 1, FUTEX_OP_CMP_LE, 1);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 0);
- ATF_REQUIRE(futex_word1 == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 1, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_SET, 1, FUTEX_OP_CMP_LE, 1);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 1);
- ATF_REQUIRE(futex_word1 == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 1, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 1, "futex_word1=%d", futex_word1);
/* #LWPs = 2 */
op = FUTEX_OP(FUTEX_OP_SET, 3, FUTEX_OP_CMP_GT, 3);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 0);
- ATF_REQUIRE(futex_word1 == 3);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 3, "futex_word1=%d", futex_word1);
op = FUTEX_OP(FUTEX_OP_SET, 2, FUTEX_OP_CMP_GT, 2);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 1);
- ATF_REQUIRE(futex_word1 == 2);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 1, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
/* #LWPs = 1 */
op = FUTEX_OP(FUTEX_OP_SET, 3, FUTEX_OP_CMP_GE, 4);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 0);
- ATF_REQUIRE(futex_word1 == 3);
-
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 0, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 3, "futex_word1=%d", futex_word1);
+
op = FUTEX_OP(FUTEX_OP_SET, 2, FUTEX_OP_CMP_GE, 3);
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE_OP | flags,
- 0, NULL, &futex_word1, 1, op) == 1);
- ATF_REQUIRE(futex_word1 == 2);
+ RL(n = __futex(&futex_word, FUTEX_WAKE_OP | flags,
+ 0, NULL, &futex_word1, 1, op));
+ ATF_CHECK_EQ_MSG(n, 1, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word1, 2, "futex_word1=%d", futex_word1);
/* #LWPs = 0 */
@@ -1137,7 +1242,8 @@ do_futex_wake_op_cmp_test(int flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 0, "waiters failed to exit");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 0,
+ "waiters failed to exit, nlwps_running=%u", nlwps_running);
reap_wake_op_test_lwps();
@@ -1149,11 +1255,12 @@ do_futex_wake_op_cmp_test(int flags)
create_wake_op_test_lwps(flags);
/* #LWPs = 6 */
- ATF_REQUIRE(futex_word == 0);
+ ATF_CHECK_EQ_MSG(futex_word, 0, "futex_word=%d", futex_word);
op = FUTEX_OP(FUTEX_OP_SET, 0, FUTEX_OP_CMP_EQ, 666);
- ATF_REQUIRE(__futex(&futex_word1, FUTEX_WAKE_OP | flags,
- INT_MAX, NULL, &futex_word, 0, op) == 6);
- ATF_REQUIRE(futex_word == 0);
+ RL(n = __futex(&futex_word1, FUTEX_WAKE_OP | flags,
+ INT_MAX, NULL, &futex_word, 0, op));
+ ATF_CHECK_EQ_MSG(n, 6, "n=%d woken", n);
+ ATF_CHECK_EQ_MSG(futex_word, 0, "futex_word=%d", futex_word);
/* #LWPs = 0 */
@@ -1166,7 +1273,8 @@ do_futex_wake_op_cmp_test(int flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 0, "waiters failed to exit");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 0,
+ "waiters failed to exit, nlwps_running=%u", nlwps_running);
reap_wake_op_test_lwps();
}
@@ -1188,6 +1296,10 @@ ATF_TC_CLEANUP(futex_wake_op_cmp, tc)
/*****************************************************************************/
+
+
+/*****************************************************************************/
+
static void
do_futex_wait_timeout(bool relative, clockid_t clock)
{
@@ -1198,7 +1310,7 @@ do_futex_wait_timeout(bool relative, clockid_t clock)
if (clock == CLOCK_REALTIME)
op |= FUTEX_CLOCK_REALTIME;
- ATF_REQUIRE(clock_gettime(clock, &deadline) == 0);
+ RL(clock_gettime(clock, &deadline));
deadline.tv_sec += 2;
if (relative) {
ts.tv_sec = 2;
@@ -1210,14 +1322,20 @@ do_futex_wait_timeout(bool relative, clockid_t clock)
futex_word = 1;
ATF_REQUIRE_ERRNO(ETIMEDOUT,
__futex(&futex_word, op | FUTEX_PRIVATE_FLAG,
- 1, &ts, NULL, 0, FUTEX_BITSET_MATCH_ANY) == -1);
+ 1, &ts, NULL, 0, FUTEX_BITSET_MATCH_ANY) == -1);
/* Can't reliably check CLOCK_REALTIME in the presence of NTP. */
if (clock != CLOCK_REALTIME) {
- ATF_REQUIRE(clock_gettime(clock, &ts) == 0);
- ATF_REQUIRE(ts.tv_sec >= deadline.tv_sec);
- ATF_REQUIRE(ts.tv_sec > deadline.tv_sec ||
- ts.tv_nsec >= deadline.tv_nsec);
+ RL(clock_gettime(clock, &ts));
+ ATF_CHECK_MSG(ts.tv_sec >= deadline.tv_sec,
+ "ts=%lld.%09ldsec deadline=%lld.%09ldsec",
+ (long long)ts.tv_sec, ts.tv_nsec,
+ (long long)deadline.tv_sec, deadline.tv_nsec);
+ ATF_CHECK_MSG((ts.tv_sec > deadline.tv_sec ||
+ ts.tv_nsec >= deadline.tv_nsec),
+ "ts=%lld.%09ldsec deadline=%lld.%09ldsec",
+ (long long)ts.tv_sec, ts.tv_nsec,
+ (long long)deadline.tv_sec, deadline.tv_nsec);
}
}
@@ -1281,8 +1399,7 @@ do_futex_wait_evil_unmapped(int map_flags)
create_bs(map_flags);
- old_act = signal(SIGUSR1, sig_noop);
- ATF_REQUIRE(old_act != SIG_ERR);
+ REQUIRE_LIBC(signal(SIGUSR1, sig_noop), SIG_ERR);
setup_lwp_context(&lwp_data[0], simple_test_waiter_lwp);
lwp_data[0].op_flags = 0;
@@ -1291,8 +1408,7 @@ do_futex_wait_evil_unmapped(int map_flags)
lwp_data[0].block_val = 0;
lwp_data[0].bitset = 0;
lwp_data[0].wait_op = FUTEX_WAIT;
- ATF_REQUIRE(_lwp_create(&lwp_data[0].context, 0,
- &lwp_data[0].lwpid) == 0);
+ RL(_lwp_create(&lwp_data[0].context, 0, &lwp_data[0].lwpid));
for (i = 0; i < 5; i++) {
membar_sync();
@@ -1301,16 +1417,18 @@ do_futex_wait_evil_unmapped(int map_flags)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 1, "waiters failed to start");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 1,
+ "waiters failed to start, nlwps_running=%u", nlwps_running);
/* Ensure it's blocked. */
- ATF_REQUIRE(lwp_data[0].futex_error == -1);
+ ATF_REQUIRE_EQ_MSG(lwp_data[0].futex_error, -1,
+ "lwp_data[0].futex_error=%d", lwp_data[0].futex_error);
/* Rudely unmap the backing store. */
cleanup_bs();
/* Signal the waiter so that it leaves the futex. */
- ATF_REQUIRE(_lwp_kill(lwp_data[0].threadid, SIGUSR1) == 0);
+ RL(_lwp_kill(lwp_data[0].threadid, SIGUSR1));
/* Yay! No panic! */
@@ -1347,10 +1465,10 @@ lowpri_simple_test_waiter_lwp(void *arg)
d->threadid = _lwp_self();
- ATF_REQUIRE(_sched_getparam(getpid(), d->threadid, &policy, &sp) == 0);
+ RL(_sched_getparam(getpid(), d->threadid, &policy, &sp));
policy = SCHED_RR;
sp.sched_priority = pri_min;
- ATF_REQUIRE(_sched_setparam(getpid(), d->threadid, policy, &sp) == 0);
+ RL(_sched_setparam(getpid(), d->threadid, policy, &sp));
simple_test_waiter_lwp(arg);
}
@@ -1364,10 +1482,10 @@ highpri_simple_test_waiter_lwp(void *arg)
d->threadid = _lwp_self();
- ATF_REQUIRE(_sched_getparam(getpid(), d->threadid, &policy, &sp) == 0);
+ RL(_sched_getparam(getpid(), d->threadid, &policy, &sp));
policy = SCHED_RR;
sp.sched_priority = pri_max;
- ATF_REQUIRE(_sched_setparam(getpid(), d->threadid, policy, &sp) == 0);
+ RL(_sched_setparam(getpid(), d->threadid, policy, &sp));
simple_test_waiter_lwp(arg);
}
@@ -1378,10 +1496,11 @@ do_test_wake_highest_pri(void)
lwpid_t waiter;
int tries;
long pri;
+ int n;
- ATF_REQUIRE((pri = sysconf(_SC_SCHED_PRI_MIN)) != -1);
+ RL(pri = sysconf(_SC_SCHED_PRI_MIN));
pri_min = (int)pri;
- ATF_REQUIRE((pri = sysconf(_SC_SCHED_PRI_MAX)) != -1);
+ RL(pri = sysconf(_SC_SCHED_PRI_MAX));
pri_max = (int)pri;
futex_word = 0;
@@ -1394,8 +1513,7 @@ do_test_wake_highest_pri(void)
lwp_data[0].block_val = 0;
lwp_data[0].bitset = 0;
lwp_data[0].wait_op = FUTEX_WAIT;
- ATF_REQUIRE(_lwp_create(&lwp_data[0].context, 0,
- &lwp_data[0].lwpid) == 0);
+ RL(_lwp_create(&lwp_data[0].context, 0, &lwp_data[0].lwpid));
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -1404,10 +1522,12 @@ do_test_wake_highest_pri(void)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 1, "lowpri waiter failed to start");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 1,
+ "lowpri waiter failed to start, nlwps_running=%u", nlwps_running);
/* Ensure it's blocked. */
- ATF_REQUIRE(lwp_data[0].futex_error == -1);
+ ATF_REQUIRE_EQ_MSG(lwp_data[0].futex_error, -1,
+ "lwp_data[0].futex_error=%d", lwp_data[0].futex_error);
setup_lwp_context(&lwp_data[1], highpri_simple_test_waiter_lwp);
lwp_data[1].op_flags = FUTEX_PRIVATE_FLAG;
@@ -1416,8 +1536,7 @@ do_test_wake_highest_pri(void)
lwp_data[1].block_val = 0;
lwp_data[1].bitset = 0;
lwp_data[1].wait_op = FUTEX_WAIT;
- ATF_REQUIRE(_lwp_create(&lwp_data[1].context, 0,
- &lwp_data[1].lwpid) == 0);
+ RL(_lwp_create(&lwp_data[1].context, 0, &lwp_data[1].lwpid));
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -1426,14 +1545,17 @@ do_test_wake_highest_pri(void)
sleep(1);
}
membar_sync();
- ATF_REQUIRE_EQ_MSG(nlwps_running, 2, "highpri waiter failed to start");
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 2,
+ "highpri waiter failed to start, nlwps_running=%u", nlwps_running);
/* Ensure it's blocked. */
- ATF_REQUIRE(lwp_data[1].futex_error == -1);
+ ATF_REQUIRE_EQ_MSG(lwp_data[1].futex_error, -1,
+ "lwp_data[1].futex_error=%d", lwp_data[1].futex_error);
/* Wake the first LWP. We should get the highpri thread. */
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
- 1, NULL, NULL, 0, 0) == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
+ 1, NULL, NULL, 0, 0));
+ ATF_REQUIRE_EQ_MSG(n, 1, "n=%d woken", n);
sleep(1);
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -1442,13 +1564,17 @@ do_test_wake_highest_pri(void)
sleep(1);
}
membar_sync();
- ATF_REQUIRE(nlwps_running == 1);
- ATF_REQUIRE(_lwp_wait(0, &waiter) == 0);
- ATF_REQUIRE(waiter == lwp_data[1].threadid);
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 1, "nlwps_running=%u",
+ nlwps_running);
+ RL(_lwp_wait(0, &waiter));
+ ATF_REQUIRE_EQ_MSG(waiter, lwp_data[1].threadid,
+ "waiter=%ld lwp_data[1].threadid=%ld",
+ (long)waiter, (long)lwp_data[1].threadid);
/* Wake the second LWP. We should get the lowpri thread. */
- ATF_REQUIRE(__futex(&futex_word, FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
- 1, NULL, NULL, 0, 0) == 1);
+ RL(n = __futex(&futex_word, FUTEX_WAKE | FUTEX_PRIVATE_FLAG,
+ 1, NULL, NULL, 0, 0));
+ ATF_REQUIRE_EQ_MSG(n, 1, "n=%d woken", n);
sleep(1);
for (tries = 0; tries < 5; tries++) {
membar_sync();
@@ -1457,9 +1583,12 @@ do_test_wake_highest_pri(void)
sleep(1);
}
membar_sync();
- ATF_REQUIRE(nlwps_running == 0);
- ATF_REQUIRE(_lwp_wait(0, &waiter) == 0);
- ATF_REQUIRE(waiter == lwp_data[0].threadid);
+ ATF_REQUIRE_EQ_MSG(nlwps_running, 0, "nlwps_running=%u",
+ nlwps_running);
+ RL(_lwp_wait(0, &waiter));
+ ATF_REQUIRE_EQ_MSG(waiter, lwp_data[0].threadid,
+ "waiter=%ld lwp_data[0].threadid=%ld",
+ (long)waiter, (long)lwp_data[0].threadid);
}
ATF_TC_WITH_CLEANUP(futex_wake_highest_pri);
@@ -1507,6 +1636,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, futex_requeue);
ATF_TP_ADD_TC(tp, futex_cmp_requeue);
+ ATF_TP_ADD_TC(tp, futex_cmp_requeue_trivial);
ATF_TP_ADD_TC(tp, futex_wake_op_op);
ATF_TP_ADD_TC(tp, futex_wake_op_cmp);
diff --git a/lib/libc/sys/t_getitimer.c b/lib/libc/sys/t_getitimer.c
index b8d1d87d8bb5..f3a268e15c23 100644
--- a/lib/libc/sys/t_getitimer.c
+++ b/lib/libc/sys/t_getitimer.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_getitimer.c,v 1.4 2022/04/04 19:33:46 andvar Exp $ */
+/* $NetBSD: t_getitimer.c,v 1.6 2026/02/07 01:47:23 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_getitimer.c,v 1.4 2022/04/04 19:33:46 andvar Exp $");
+__RCSID("$NetBSD: t_getitimer.c,v 1.6 2026/02/07 01:47:23 riastradh Exp $");
#include <sys/time.h>
@@ -40,15 +40,19 @@ __RCSID("$NetBSD: t_getitimer.c,v 1.4 2022/04/04 19:33:46 andvar Exp $");
#include <string.h>
#include <unistd.h>
-static bool fail;
-static void sighandler(int);
+#include "h_macros.h"
+
+#define TIME_MAX __type_max(time_t)
+
+static sig_atomic_t fired;
+static void sighandler(int);
static void
sighandler(int signo)
{
if (signo == SIGALRM || signo == SIGVTALRM)
- fail = false;
+ fired = 1;
}
ATF_TC(getitimer_empty);
@@ -125,8 +129,7 @@ ATF_TC_BODY(setitimer_basic, tc)
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 0;
- fail = true;
-
+ fired = 0;
ATF_REQUIRE(signal(SIGALRM, sighandler) != SIG_ERR);
ATF_REQUIRE(setitimer(ITIMER_REAL, &it, NULL) == 0);
@@ -139,7 +142,7 @@ ATF_TC_BODY(setitimer_basic, tc)
*/
(void)sleep(1);
- if (fail != false)
+ if (!fired)
atf_tc_fail("timer did not fire");
}
@@ -201,6 +204,43 @@ ATF_TC_BODY(setitimer_old, tc)
atf_tc_fail("setitimer(2) did not store old values");
}
+ATF_TC(setitimer_invalidtime);
+ATF_TC_HEAD(setitimer_invalidtime, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test invalid values in setitimer(2)");
+}
+
+ATF_TC_BODY(setitimer_invalidtime, tc)
+{
+ const struct itimerval it[] = {
+ [0] = { .it_value = {-1, 0} },
+ [1] = { .it_value = {0, -1} },
+ [2] = { .it_value = {0, 1000001} },
+ [3] = { .it_value = {1, 0}, .it_interval = {-1, 0} },
+ [4] = { .it_value = {1, 0}, .it_interval = {0, -1} },
+ [5] = { .it_value = {1, 0}, .it_interval = {0, 1000001} },
+ [6] = { .it_value = {TIME_MAX - 1, 0}, .it_interval = {0, 0} },
+ [7] = { .it_value = {TIME_MAX, 0}, .it_interval = {0, 0} },
+ };
+ sigset_t sigs, mask;
+ unsigned i;
+
+ RL(sigemptyset(&sigs));
+ RL(sigaddset(&sigs, SIGALRM));
+ RL(sigprocmask(SIG_BLOCK, &sigs, &mask));
+
+ for (i = 0; i < __arraycount(it); i++) {
+ fprintf(stderr, "case %u\n", i);
+ ATF_CHECK_ERRNO(EINVAL,
+ setitimer(ITIMER_REAL, &it[i], NULL) == -1);
+ }
+
+ /* Wait up to 2sec to make sure no timer got set anyway. */
+ ATF_CHECK_ERRNO(EAGAIN,
+ sigtimedwait(&sigs, NULL, &(const struct timespec){2, 0}) == -1);
+ RL(sigprocmask(SIG_SETMASK, &mask, NULL));
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -209,6 +249,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, setitimer_basic);
ATF_TP_ADD_TC(tp, setitimer_err);
ATF_TP_ADD_TC(tp, setitimer_old);
+ ATF_TP_ADD_TC(tp, setitimer_invalidtime);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_getrusage.c b/lib/libc/sys/t_getrusage.c
index 03d3f03f39b7..8b54f6f2423d 100644
--- a/lib/libc/sys/t_getrusage.c
+++ b/lib/libc/sys/t_getrusage.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_getrusage.c,v 1.8 2018/05/09 08:45:03 mrg Exp $ */
+/* $NetBSD: t_getrusage.c,v 1.9 2024/04/12 07:16:50 gson Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_getrusage.c,v 1.8 2018/05/09 08:45:03 mrg Exp $");
+__RCSID("$NetBSD: t_getrusage.c,v 1.9 2024/04/12 07:16:50 gson Exp $");
#include <sys/resource.h>
#include <sys/time.h>
@@ -126,6 +126,7 @@ ATF_TC(getrusage_maxrss);
ATF_TC_HEAD(getrusage_maxrss, tc)
{
atf_tc_set_md_var(tc, "descr", "Test maxrss growing with getrusage(2)");
+ atf_tc_set_md_var(tc, "require.memory", "64M");
}
ATF_TC_BODY(getrusage_maxrss, tc)
diff --git a/lib/libc/sys/t_kill.c b/lib/libc/sys/t_kill.c
index 2f4286246ad2..b03b7fbd8040 100644
--- a/lib/libc/sys/t_kill.c
+++ b/lib/libc/sys/t_kill.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_kill.c,v 1.1 2011/07/07 06:57:53 jruoho Exp $ */
+/* $NetBSD: t_kill.c,v 1.2 2024/07/15 06:19:07 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_kill.c,v 1.1 2011/07/07 06:57:53 jruoho Exp $");
+__RCSID("$NetBSD: t_kill.c,v 1.2 2024/07/15 06:19:07 riastradh Exp $");
#include <sys/wait.h>
@@ -299,6 +299,18 @@ ATF_TC_BODY(kill_pgrp_zero, tc)
atf_tc_fail("failed to kill(2) a process group");
}
+ATF_TC(kill_int_min);
+ATF_TC_HEAD(kill_int_min, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test kill(INT_MIN) fails with ESRCH");
+}
+
+ATF_TC_BODY(kill_int_min, tc)
+{
+
+ ATF_CHECK_ERRNO(ESRCH, kill(INT_MIN, 0));
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -307,6 +319,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, kill_perm);
ATF_TP_ADD_TC(tp, kill_pgrp_neg);
ATF_TP_ADD_TC(tp, kill_pgrp_zero);
+ ATF_TP_ADD_TC(tp, kill_int_min);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_pipe2.c b/lib/libc/sys/t_pipe2.c
index 12a9394b7f2b..a81b62731c56 100644
--- a/lib/libc/sys/t_pipe2.c
+++ b/lib/libc/sys/t_pipe2.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_pipe2.c,v 1.9 2017/01/13 21:19:45 christos Exp $ */
+/* $NetBSD: t_pipe2.c,v 1.10 2025/07/17 19:50:40 kre Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_pipe2.c,v 1.9 2017/01/13 21:19:45 christos Exp $");
+__RCSID("$NetBSD: t_pipe2.c,v 1.10 2025/07/17 19:50:40 kre Exp $");
#include <atf-c.h>
#include <fcntl.h>
@@ -45,6 +45,13 @@ __RCSID("$NetBSD: t_pipe2.c,v 1.9 2017/01/13 21:19:45 christos Exp $");
#include <errno.h>
#include <sys/resource.h>
+#ifndef FD_CLOFORK
+#define FD_CLOFORK 0
+#endif
+#ifndef O_CLOFORK
+#define O_CLOFORK 0
+#endif
+
static void
run(int flags)
{
@@ -69,6 +76,14 @@ run(int flags)
ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) == 0);
}
+ if (flags & O_CLOFORK) {
+ ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOFORK) != 0);
+ ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOFORK) != 0);
+ } else {
+ ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOFORK) == 0);
+ ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOFORK) == 0);
+ }
+
if (flags & O_NONBLOCK) {
ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) != 0);
ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) != 0);
@@ -156,6 +171,21 @@ ATF_TC_BODY(pipe2_cloexec, tc)
run(O_CLOEXEC);
}
+ATF_TC(pipe2_clofork);
+ATF_TC_HEAD(pipe2_clofork, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "A close-on-fork test of pipe2(2)");
+}
+
+ATF_TC_BODY(pipe2_clofork, tc)
+{
+#if defined(O_CLOFORK) && O_CLOFORK != 0
+ run(O_CLOFORK);
+#else
+ atf_tc_skip("O_CLOFORK not yet implemented");
+#endif
+}
+
ATF_TC(pipe2_nosigpipe);
ATF_TC_HEAD(pipe2_nosigpipe, tc)
{
@@ -186,6 +216,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, pipe2_consume);
ATF_TP_ADD_TC(tp, pipe2_nonblock);
ATF_TP_ADD_TC(tp, pipe2_cloexec);
+ ATF_TP_ADD_TC(tp, pipe2_clofork);
ATF_TP_ADD_TC(tp, pipe2_nosigpipe);
ATF_TP_ADD_TC(tp, pipe2_einval);
diff --git a/lib/libc/sys/t_poll.c b/lib/libc/sys/t_poll.c
index 48f63e528eee..104bf4adde09 100644
--- a/lib/libc/sys/t_poll.c
+++ b/lib/libc/sys/t_poll.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_poll.c,v 1.8 2021/10/02 17:32:55 thorpej Exp $ */
+/* $NetBSD: t_poll.c,v 1.12 2025/02/10 02:41:34 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,6 +29,8 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/ioctl.h>
+#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/wait.h>
@@ -38,11 +40,15 @@
#include <fcntl.h>
#include <paths.h>
#include <poll.h>
+#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
+#include <termios.h>
#include <unistd.h>
+#include "h_macros.h"
+
static int desc;
static void
@@ -101,35 +107,33 @@ ATF_TC_BODY(3way, tc)
int pf[2];
int status, i;
pid_t pid;
+ ssize_t nwrit;
- pipe(pf);
+ RL(pipe(pf));
desc = pf[0];
- pid = fork();
- ATF_REQUIRE(pid >= 0);
-
+ RL(pid = fork());
if (pid == 0) {
- (void)close(pf[1]);
+ if (close(pf[1]) == -1)
+ _exit(1);
child1();
_exit(0);
/* NOTREACHED */
}
- pid = fork();
- ATF_REQUIRE(pid >= 0);
-
+ RL(pid = fork());
if (pid == 0) {
- (void)close(pf[1]);
+ if (close(pf[1]) == -1)
+ _exit(1);
child2();
_exit(0);
/* NOTREACHED */
}
- pid = fork();
- ATF_REQUIRE( pid >= 0);
-
+ RL(pid = fork());
if (pid == 0) {
- (void)close(pf[1]);
+ if (close(pf[1]) == -1)
+ _exit(1);
child3();
_exit(0);
/* NOTREACHED */
@@ -139,10 +143,11 @@ ATF_TC_BODY(3way, tc)
(void)printf("parent write\n");
- ATF_REQUIRE(write(pf[1], "konec\n", 6) == 6);
+ RL(nwrit = write(pf[1], "konec\n", 6));
+ ATF_REQUIRE_EQ_MSG(nwrit, 6, "nwrit=%zd", nwrit);
- for(i = 0; i < 3; ++i)
- (void)wait(&status);
+ for (i = 0; i < 3; i++)
+ RL(wait(&status));
(void)printf("parent terminated\n");
}
@@ -160,8 +165,9 @@ ATF_TC_BODY(basic, tc)
int fds[2];
struct pollfd pfds[2];
int ret;
+ ssize_t nwrit;
- ATF_REQUIRE_EQ(pipe(fds), 0);
+ RL(pipe(fds));
pfds[0].fd = fds[0];
pfds[0].events = POLLIN;
@@ -174,16 +180,16 @@ ATF_TC_BODY(basic, tc)
*/
pfds[0].revents = -1;
pfds[1].revents = -1;
- ATF_REQUIRE_EQ_MSG(ret = poll(&pfds[0], 1, 1), 0,
- "got: %d", ret);
+ RL(ret = poll(&pfds[0], 1, 1));
+ ATF_REQUIRE_EQ_MSG(ret, 0, "got: %d", ret);
ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents);
ATF_REQUIRE_EQ_MSG(pfds[1].revents, -1, "got: %d", pfds[1].revents);
/* Check that the write end of the pipe as reported as ready. */
pfds[0].revents = -1;
pfds[1].revents = -1;
- ATF_REQUIRE_EQ_MSG(ret = poll(&pfds[1], 1, 1), 1,
- "got: %d", ret);
+ RL(ret = poll(&pfds[1], 1, 1));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
ATF_REQUIRE_EQ_MSG(pfds[0].revents, -1, "got: %d", pfds[0].revents);
ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",\
pfds[1].revents);
@@ -191,27 +197,28 @@ ATF_TC_BODY(basic, tc)
/* Check that only the write end of the pipe as reported as ready. */
pfds[0].revents = -1;
pfds[1].revents = -1;
- ATF_REQUIRE_EQ_MSG(ret = poll(pfds, 2, 1), 1,
- "got: %d", ret);
+ RL(ret = poll(pfds, 2, 1));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents);
ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",
pfds[1].revents);
/* Write data to our pipe. */
- ATF_REQUIRE_EQ(write(fds[1], "", 1), 1);
+ RL(nwrit = write(fds[1], "", 1));
+ ATF_REQUIRE_EQ_MSG(nwrit, 1, "nwrit=%zd", nwrit);
/* Check that both ends of our pipe are reported as ready. */
pfds[0].revents = -1;
pfds[1].revents = -1;
- ATF_REQUIRE_EQ_MSG(ret = poll(pfds, 2, 1), 2,
- "got: %d", ret);
+ RL(ret = poll(pfds, 2, 1));
+ ATF_REQUIRE_EQ_MSG(ret, 2, "got: %d", ret);
ATF_REQUIRE_EQ_MSG(pfds[0].revents, POLLIN, "got: %d",
pfds[0].revents);
ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",
pfds[1].revents);
- ATF_REQUIRE_EQ(close(fds[0]), 0);
- ATF_REQUIRE_EQ(close(fds[1]), 0);
+ RL(close(fds[0]));
+ RL(close(fds[1]));
}
ATF_TC(err);
@@ -240,9 +247,10 @@ static const char fifo_path[] = "pollhup_fifo";
static void
fifo_support(void)
{
+
errno = 0;
if (mkfifo(fifo_path, 0600) == 0) {
- ATF_REQUIRE(unlink(fifo_path) == 0);
+ RL(unlink(fifo_path));
return;
}
@@ -266,19 +274,20 @@ ATF_TC_BODY(fifo_inout, tc)
char *buf;
int rfd, wfd;
long pipe_buf;
+ int ret;
+ ssize_t nwrit, nread;
fifo_support();
- ATF_REQUIRE(mkfifo(fifo_path, 0600) == 0);
- ATF_REQUIRE((rfd = open(fifo_path, O_RDONLY | O_NONBLOCK)) >= 0);
- ATF_REQUIRE((wfd = open(fifo_path, O_WRONLY | O_NONBLOCK)) >= 0);
+ RL(mkfifo(fifo_path, 0600));
+ RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
+ RL(wfd = open(fifo_path, O_WRONLY | O_NONBLOCK));
/* Get the maximum atomic pipe write size. */
pipe_buf = fpathconf(wfd, _PC_PIPE_BUF);
- ATF_REQUIRE(pipe_buf > 1);
+ ATF_REQUIRE_MSG(pipe_buf > 1, "pipe_buf=%ld", pipe_buf);
- buf = malloc(pipe_buf);
- ATF_REQUIRE(buf != NULL);
+ REQUIRE_LIBC(buf = malloc(pipe_buf), NULL);
memset(&pfd, 0, sizeof(pfd));
pfd[0].fd = rfd;
@@ -287,20 +296,28 @@ ATF_TC_BODY(fifo_inout, tc)
pfd[1].events = POLLOUT | POLLWRNORM;
/* We expect the FIFO to be writable but not readable. */
- ATF_REQUIRE(poll(pfd, 2, 0) == 1);
- ATF_REQUIRE(pfd[0].revents == 0);
- ATF_REQUIRE(pfd[1].revents == (POLLOUT | POLLWRNORM));
+ RL(ret = poll(pfd, 2, 0));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
+ ATF_REQUIRE_EQ_MSG(pfd[0].revents, 0,
+ "pfd[0].revents=0x%x", pfd[0].revents);
+ ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
+ "pfd[1].revents=0x%x", pfd[1].revents);
/* Write a single byte of data into the FIFO. */
- ATF_REQUIRE(write(wfd, buf, 1) == 1);
+ RL(nwrit = write(wfd, buf, 1));
+ ATF_REQUIRE_EQ_MSG(nwrit, 1, "nwrit=%zd", nwrit);
/* We expect the FIFO to be readable and writable. */
- ATF_REQUIRE(poll(pfd, 2, 0) == 2);
- ATF_REQUIRE(pfd[0].revents == (POLLIN | POLLRDNORM));
- ATF_REQUIRE(pfd[1].revents == (POLLOUT | POLLWRNORM));
+ RL(ret = poll(pfd, 2, 0));
+ ATF_REQUIRE_EQ_MSG(ret, 2, "got: %d", ret);
+ ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
+ "pfd[0].revents=0x%x", pfd[0].revents);
+ ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
+ "pfd[1].revents=0x%x", pfd[1].revents);
/* Read that single byte back out. */
- ATF_REQUIRE(read(rfd, buf, 1) == 1);
+ RL(nread = read(rfd, buf, 1));
+ ATF_REQUIRE_EQ_MSG(nread, 1, "nread=%zd", nread);
/*
* Write data into the FIFO until it is full, which is
@@ -310,33 +327,44 @@ ATF_TC_BODY(fifo_inout, tc)
while (write(wfd, buf, pipe_buf) != -1) {
continue;
}
- ATF_REQUIRE(errno == EAGAIN);
+ ATF_REQUIRE_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
/* We expect the FIFO to be readble but not writable. */
- ATF_REQUIRE(poll(pfd, 2, 0) == 1);
- ATF_REQUIRE(pfd[0].revents == (POLLIN | POLLRDNORM));
- ATF_REQUIRE(pfd[1].revents == 0);
+ RL(ret = poll(pfd, 2, 0));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
+ ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
+ "pfd[0].revents=0x%x", pfd[0].revents);
+ ATF_REQUIRE_EQ_MSG(pfd[1].revents, 0,
+ "pfd[1].revents=0x%x", pfd[1].revents);
/* Read a single byte of data from the FIFO. */
- ATF_REQUIRE(read(rfd, buf, 1) == 1);
+ RL(nread = read(rfd, buf, 1));
+ ATF_REQUIRE_EQ_MSG(nread, 1, "nread=%zd", nread);
/*
* Because we have read only a single byte out, there will
* be insufficient space for a pipe_buf-sized message, so
* the FIFO should still not be writable.
*/
- ATF_REQUIRE(poll(pfd, 2, 0) == 1);
- ATF_REQUIRE(pfd[0].revents == (POLLIN | POLLRDNORM));
- ATF_REQUIRE(pfd[1].revents == 0);
+ RL(ret = poll(pfd, 2, 0));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
+ ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
+ "pfd[0].revents=0x%x", pfd[0].revents);
+ ATF_REQUIRE_EQ_MSG(pfd[1].revents, 0,
+ "pfd[1].revents=0x%x", pfd[1].revents);
/*
* Now read enough so that exactly pipe_buf space should
* be available. The FIFO should be writable after that.
* N.B. we don't care if it's readable at this point.
*/
- ATF_REQUIRE(read(rfd, buf, pipe_buf - 1) == pipe_buf - 1);
- ATF_REQUIRE(poll(pfd, 2, 0) >= 1);
- ATF_REQUIRE(pfd[1].revents == (POLLOUT | POLLWRNORM));
+ RL(nread = read(rfd, buf, pipe_buf - 1));
+ ATF_REQUIRE_EQ_MSG(nread, pipe_buf - 1, "nread=%zd pipe_buf-1=%ld",
+ nread, pipe_buf - 1);
+ RL(ret = poll(pfd, 2, 0));
+ ATF_REQUIRE_MSG(ret >= 1, "got: %d", ret);
+ ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
+ "pfd[1].revents=0x%x", pfd[1].revents);
/*
* Now read all of the data out of the FIFO and ensure that
@@ -345,14 +373,17 @@ ATF_TC_BODY(fifo_inout, tc)
while (read(rfd, buf, pipe_buf) != -1) {
continue;
}
- ATF_REQUIRE(errno == EAGAIN);
+ ATF_REQUIRE_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
- ATF_REQUIRE(poll(pfd, 2, 0) == 1);
- ATF_REQUIRE(pfd[0].revents == 0);
- ATF_REQUIRE(pfd[1].revents == (POLLOUT | POLLWRNORM));
+ RL(ret = poll(pfd, 2, 0));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
+ ATF_REQUIRE_EQ_MSG(pfd[0].revents, 0,
+ "pfd[0].revents=0x%x", pfd[0].revents);
+ ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
+ "pfd[1].revents=0x%x", pfd[1].revents);
- (void)close(wfd);
- (void)close(rfd);
+ RL(close(wfd));
+ RL(close(rfd));
}
ATF_TC_CLEANUP(fifo_inout, tc)
@@ -371,21 +402,25 @@ ATF_TC_BODY(fifo_hup1, tc)
{
struct pollfd pfd;
int rfd, wfd;
+ int ret;
fifo_support();
- ATF_REQUIRE(mkfifo(fifo_path, 0600) == 0);
- ATF_REQUIRE((rfd = open(fifo_path, O_RDONLY | O_NONBLOCK)) >= 0);
- ATF_REQUIRE((wfd = open(fifo_path, O_WRONLY)) >= 0);
+ RL(mkfifo(fifo_path, 0600));
+ RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
+ RL(wfd = open(fifo_path, O_WRONLY));
memset(&pfd, 0, sizeof(pfd));
pfd.fd = rfd;
pfd.events = POLLIN;
- (void)close(wfd);
+ RL(close(wfd));
- ATF_REQUIRE(poll(&pfd, 1, 0) == 1);
- ATF_REQUIRE((pfd.revents & POLLHUP) != 0);
+ RL(ret = poll(&pfd, 1, 0));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
+ ATF_REQUIRE_EQ_MSG((pfd.revents & (POLLHUP|POLLOUT)), POLLHUP,
+ "revents=0x%x expected POLLHUP=0x%x but not POLLOUT=0x%x",
+ pfd.revents, POLLHUP, POLLOUT);
/*
* Check that POLLHUP is cleared when a writer re-connects.
@@ -396,8 +431,9 @@ ATF_TC_BODY(fifo_hup1, tc)
pfd.fd = rfd;
pfd.events = POLLIN;
- ATF_REQUIRE((wfd = open(fifo_path, O_WRONLY)) >= 0);
- ATF_REQUIRE(poll(&pfd, 1, 0) == 0);
+ RL(wfd = open(fifo_path, O_WRONLY));
+ RL(ret = poll(&pfd, 1, 0));
+ ATF_REQUIRE_EQ_MSG(ret, 0, "got: %d", ret);
}
ATF_TC_CLEANUP(fifo_hup1, tc)
@@ -418,36 +454,43 @@ ATF_TC_BODY(fifo_hup2, tc)
int rfd, wfd;
pid_t pid;
struct timespec ts1, ts2;
+ int ret;
fifo_support();
- ATF_REQUIRE(mkfifo(fifo_path, 0600) == 0);
- ATF_REQUIRE((rfd = open(fifo_path, O_RDONLY | O_NONBLOCK)) >= 0);
- ATF_REQUIRE((wfd = open(fifo_path, O_WRONLY)) >= 0);
+ RL(mkfifo(fifo_path, 0600));
+ RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
+ RL(wfd = open(fifo_path, O_WRONLY));
memset(&pfd, 0, sizeof(pfd));
pfd.fd = rfd;
pfd.events = POLLIN;
- pid = fork();
- ATF_REQUIRE(pid >= 0);
-
+ RL(pid = fork());
if (pid == 0) {
- (void)close(rfd);
+ if (close(rfd))
+ _exit(1);
sleep(5);
- (void)close(wfd);
+ if (close(wfd))
+ _exit(1);
_exit(0);
}
- (void)close(wfd);
+ RL(close(wfd));
- ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &ts1) == 0);
- ATF_REQUIRE(poll(&pfd, 1, INFTIM) == 1);
- ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &ts2) == 0);
+ RL(clock_gettime(CLOCK_MONOTONIC, &ts1));
+ RL(ret = poll(&pfd, 1, INFTIM));
+ ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
+ RL(clock_gettime(CLOCK_MONOTONIC, &ts2));
/* Make sure at least a couple of seconds have elapsed. */
- ATF_REQUIRE(ts2.tv_sec - ts1.tv_sec >= 2);
+ ATF_REQUIRE_MSG(ts2.tv_sec - ts1.tv_sec >= 2,
+ "ts1=%lld.%09ld ts2=%lld.%09ld",
+ (long long)ts1.tv_sec, ts1.tv_nsec,
+ (long long)ts2.tv_sec, ts2.tv_nsec);
- ATF_REQUIRE((pfd.revents & POLLHUP) != 0);
+ ATF_REQUIRE_EQ_MSG((pfd.revents & (POLLHUP|POLLOUT)), POLLHUP,
+ "revents=0x%x expected POLLHUP=0x%x but not POLLOUT=0x%x",
+ pfd.revents, POLLHUP, POLLOUT);
}
ATF_TC_CLEANUP(fifo_hup2, tc)
@@ -455,6 +498,1592 @@ ATF_TC_CLEANUP(fifo_hup2, tc)
(void)unlink(fifo_path);
}
+static void
+fillpipebuf(int writefd)
+{
+ char buf[BUFSIZ] = {0};
+ size_t n = 0;
+ ssize_t nwrit;
+ int flags;
+
+ RL(flags = fcntl(writefd, F_GETFL));
+ RL(fcntl(writefd, F_SETFL, flags|O_NONBLOCK));
+ while ((nwrit = write(writefd, buf, sizeof(buf))) != -1)
+ n += (size_t)nwrit;
+ ATF_CHECK_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
+ RL(fcntl(writefd, F_SETFL, flags));
+ fprintf(stderr, "filled %d with %zu bytes\n", writefd, n);
+}
+
+static void
+check_write_fail(int writefd, int error)
+{
+ int flags;
+ void (*sighandler)(int);
+ char c = 0;
+ ssize_t nwrit;
+
+ RL(flags = fcntl(writefd, F_GETFL));
+ RL(fcntl(writefd, F_SETFL, flags|O_NONBLOCK));
+
+ REQUIRE_LIBC(sighandler = signal(SIGPIPE, SIG_IGN), SIG_ERR);
+ ATF_CHECK_ERRNO(error, (nwrit = write(writefd, &c, 1)) == -1);
+ ATF_CHECK_EQ_MSG(nwrit, -1, "nwrit=%zd", nwrit);
+ REQUIRE_LIBC(signal(SIGPIPE, sighandler), SIG_ERR);
+
+ RL(fcntl(writefd, F_SETFL, flags));
+}
+
+static void
+check_read_eof(int readfd)
+{
+ int flags;
+ char c;
+ ssize_t nread;
+
+ RL(flags = fcntl(readfd, F_GETFL));
+ RL(fcntl(readfd, F_SETFL, flags|O_NONBLOCK));
+
+ RL(nread = read(readfd, &c, 1));
+ ATF_CHECK_EQ_MSG(nread, 0, "nread=%zu", nread);
+
+ RL(fcntl(readfd, F_SETFL, flags));
+}
+
+static void
+check_pollclosed_delayed_write(int writefd, int readfd,
+ int expected, int writeerror)
+{
+ struct pollfd pfd = { .fd = writefd, .events = POLLOUT };
+ struct timespec start, end, delta;
+ int nfds;
+
+ /*
+ * Don't let poll sleep for more than 3sec. (The close delay
+ * will be 2sec, and we make sure that we sleep at least 1sec.)
+ */
+ REQUIRE_LIBC(alarm(3), (unsigned)-1);
+
+ /*
+ * Wait in poll(2) indefinitely (subject to the alarm) and
+ * measure how long we slept.
+ */
+ fprintf(stderr, "poll %d\n", writefd);
+ RL(clock_gettime(CLOCK_MONOTONIC, &start));
+ RL(nfds = poll(&pfd, 1, INFTIM));
+ RL(clock_gettime(CLOCK_MONOTONIC, &end));
+ fprintf(stderr, "poll %d done nfds=%d\n", writefd, nfds);
+
+ REQUIRE_LIBC(alarm(0), (unsigned)-1);
+
+ /*
+ * The reader has been closed, so write will fail immediately
+ * with EPIPE/SIGPIPE, and thus POLLOUT must be set. POLLHUP
+ * is only returned for reads, not for writes (and is mutually
+ * exclusive with POLLOUT). Except we _do_ return POLLHUP
+ * instead of POLLOUT for terminals.
+ */
+ RL(nfds = poll(&pfd, 1, 0));
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG(pfd.fd, writefd, "pfd.fd=%d writefd=%d",
+ pfd.fd, writefd);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)), expected,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, expected, POLLOUT, POLLHUP, POLLIN);
+
+ /*
+ * We should have slept at least 1sec.
+ */
+ timespecsub(&end, &start, &delta);
+ ATF_CHECK_MSG(delta.tv_sec >= 1,
+ "slept only %lld.%09ld", (long long)delta.tv_sec, delta.tv_nsec);
+
+ /*
+ * Write should fail with EPIPE/SIGPIPE now, or EIO for
+ * terminals -- and continue to do so.
+ */
+ check_write_fail(writefd, writeerror);
+ check_write_fail(writefd, writeerror);
+}
+
+static void
+check_pollclosed_delayed_write_fifopipesocket(int writefd, int readfd)
+{
+
+ check_pollclosed_delayed_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+static void
+check_pollclosed_delayed_write_terminal(int writefd, int readfd)
+{
+
+ check_pollclosed_delayed_write(writefd, readfd, POLLHUP, EIO);
+}
+
+static void
+check_pollclosed_delayed_read(int readfd, int writefd, int pollhup)
+{
+ struct pollfd pfd;
+ struct timespec start, end, delta;
+ int nfds;
+
+ /*
+ * Don't let poll sleep for more than 3sec. (The close delay
+ * will be 2sec, and we make sure that we sleep at least 1sec.)
+ */
+ REQUIRE_LIBC(alarm(3), (unsigned)-1);
+
+ /*
+ * Wait in poll(2) indefinitely (subject to the alarm) and
+ * measure how long we slept.
+ */
+ pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
+ fprintf(stderr, "poll %d\n", readfd);
+ RL(clock_gettime(CLOCK_MONOTONIC, &start));
+ RL(nfds = poll(&pfd, 1, INFTIM));
+ RL(clock_gettime(CLOCK_MONOTONIC, &end));
+ fprintf(stderr, "poll %d done nfds=%d\n", readfd, nfds);
+
+ REQUIRE_LIBC(alarm(0), (unsigned)-1);
+
+ /*
+ * Read will yield EOF without blocking, so POLLIN should be
+ * set, and the write side has been closed, so POLLHUP should
+ * also be set, unsolicited, if this is a pipe or FIFO -- but
+ * not if it's a socket, where POLLHUP is never set. Since we
+ * didn't ask for POLLOUT, it should be clear.
+ */
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG(pfd.fd, readfd, "pfd.fd=%d readfd=%d writefd=%d",
+ pfd.fd, readfd, writefd);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
+ pollhup|POLLIN,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
+
+ /*
+ * We should have slept at least 1sec.
+ */
+ timespecsub(&end, &start, &delta);
+ ATF_CHECK_MSG(delta.tv_sec >= 1,
+ "slept only %lld.%09ld", (long long)delta.tv_sec, delta.tv_nsec);
+
+ /*
+ * Read should return EOF now -- and continue to do so.
+ */
+ check_read_eof(readfd);
+ check_read_eof(readfd);
+
+ /*
+ * POLLHUP|POLLIN state should be persistent (until the writer
+ * side is reopened if possible, as in a named pipe).
+ */
+ pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
+ RL(nfds = poll(&pfd, 1, 0));
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG(pfd.fd, readfd, "pfd.fd=%d readfd=%d writefd=%d",
+ pfd.fd, readfd, writefd);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
+ pollhup|POLLIN,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
+}
+
+static void
+check_pollclosed_delayed_read_devfifopipe(int readfd, int writefd)
+{
+
+ check_pollclosed_delayed_read(readfd, writefd, POLLHUP);
+}
+
+static void
+check_pollclosed_delayed_read_socket(int readfd, int writefd)
+{
+
+ check_pollclosed_delayed_read(readfd, writefd, /*no POLLHUP*/0);
+}
+
+static void
+check_pollclosed_delayed_process(int pollfd, int closefd,
+ void (*check_pollhup)(int, int))
+{
+ pid_t pid;
+ int status;
+
+ /*
+ * Fork a child to close closefd after a 2sec delay.
+ */
+ RL(pid = fork());
+ if (pid == 0) {
+ sleep(2);
+ fprintf(stderr, "[child] close %d\n", closefd);
+ if (close(closefd) == -1)
+ _exit(1);
+ _exit(0);
+ }
+
+ /*
+ * Close closefd in the parent so the child has the last
+ * reference to it.
+ */
+ fprintf(stderr, "[parent] close %d\n", closefd);
+ RL(close(closefd));
+
+ /*
+ * Test poll(2).
+ */
+ (*check_pollhup)(pollfd, closefd);
+
+ /*
+ * Wait for the child and make sure it exited successfully.
+ */
+ RL(waitpid(pid, &status, 0));
+ ATF_CHECK_EQ_MSG(status, 0, "child exited with status 0x%x", status);
+}
+
+static void *
+check_pollclosed_thread(void *cookie)
+{
+ int *closefdp = cookie;
+
+ sleep(2);
+ fprintf(stderr, "[thread] close %d\n", *closefdp);
+ RL(close(*closefdp));
+ return NULL;
+}
+
+static void
+check_pollclosed_delayed_thread(int pollfd, int closefd,
+ void (*check_pollhup)(int, int))
+{
+ pthread_t t;
+
+ /*
+ * Create a thread to close closefd (in this process, not a
+ * child) after a 2sec delay.
+ */
+ RZ(pthread_create(&t, NULL, &check_pollclosed_thread, &closefd));
+
+ /*
+ * Test poll(2).
+ */
+ (*check_pollhup)(pollfd, closefd);
+
+ /*
+ * Wait for the thread to complete.
+ */
+ RZ(pthread_join(t, NULL));
+}
+
+static void
+check_pollclosed_immediate_write(int writefd, int readfd, int expected,
+ int writeerror)
+{
+ struct pollfd pfd = { .fd = writefd, .events = POLLOUT };
+ int nfds;
+
+ /*
+ * Close the reader side immediately.
+ */
+ fprintf(stderr, "[immediate] close %d\n", readfd);
+ RL(close(readfd));
+
+ /*
+ * The reader has been closed, so write will fail immediately
+ * with EPIPE/SIGPIPE, and thus POLLOUT must be set. POLLHUP
+ * is only returned for reads, not for writes (and is mutually
+ * exclusive with POLLOUT). Except we _do_ return POLLHUP
+ * instead of POLLOUT for terminals.
+ */
+ RL(nfds = poll(&pfd, 1, 0));
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG(pfd.fd, writefd, "pfd.fd=%d writefd=%d",
+ pfd.fd, writefd);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)), expected,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, expected, POLLOUT, POLLHUP, POLLIN);
+
+ /*
+ * Write should fail with EPIPE/SIGPIPE now -- and continue to
+ * do so.
+ */
+ check_write_fail(writefd, writeerror);
+ check_write_fail(writefd, writeerror);
+}
+
+static void
+check_pollclosed_immediate_readnone(int readfd, int writefd, int pollhup)
+{
+ struct pollfd pfd = { .fd = readfd, .events = POLLIN };
+ int nfds;
+
+ /*
+ * Close the writer side immediately.
+ */
+ fprintf(stderr, "[immediate] close %d\n", writefd);
+ RL(close(writefd));
+
+ /*
+ * Read will yield EOF without blocking, so POLLIN should be
+ * set, and the write side has been closed, so POLLHUP should
+ * be set, unsolicited, if this is a pipe or FIFO -- but not if
+ * it's a socket, where POLLHUP is never set. Since we didn't
+ * ask for POLLOUT, it should be clear.
+ */
+ RL(nfds = poll(&pfd, 1, 0));
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
+ pollhup|POLLIN,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
+
+ /*
+ * Read should return EOF now -- and continue to do so.
+ */
+ check_read_eof(readfd);
+ check_read_eof(readfd);
+}
+
+static void
+check_pollclosed_immediate_readsome(int readfd, int writefd, int pollhup)
+{
+ struct pollfd pfd;
+ char buf[BUFSIZ];
+ ssize_t nread;
+ int nfds;
+
+ /*
+ * Close the writer side immediately.
+ */
+ fprintf(stderr, "[immediate] close %d\n", writefd);
+ RL(close(writefd));
+
+ /*
+ * Some data should be ready to read, so POLLIN should be set,
+ * and the write side has been closed, so POLLHUP should also
+ * be set, unsolicited, if this is a pipe or FIFO -- but not if
+ * it's a socket, where POLLHUP is never set. Since we didn't
+ * ask for POLLOUT, it should be clear.
+ */
+ pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
+ RL(nfds = poll(&pfd, 1, 0));
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
+ pollhup|POLLIN,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
+
+ /*
+ * Read all the data. Each read should complete instantly --
+ * no blocking, either because there's data to read or because
+ * the writer has hung up and we get EOF.
+ */
+ do {
+ REQUIRE_LIBC(alarm(1), (unsigned)-1);
+ RL(nread = read(readfd, buf, sizeof(buf)));
+ REQUIRE_LIBC(alarm(0), (unsigned)-1);
+ } while (nread != 0);
+
+ /*
+ * Read will yield EOF without blocking, so POLLIN should be
+ * set, and the write side has been closed, so POLLHUP should
+ * also be set, unsolicited, if this is a pipe or FIFO -- but
+ * not if it's a socket, where POLLHUP is never set. Since we
+ * didn't ask for POLLOUT, it should be clear.
+ */
+ pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
+ RL(nfds = poll(&pfd, 1, 0));
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
+ pollhup|POLLIN,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
+
+ /*
+ * Read should return EOF now -- and continue to do so.
+ */
+ check_read_eof(readfd);
+ check_read_eof(readfd);
+
+ /*
+ * POLLHUP|POLLIN state should be persistent (until the writer
+ * side is reopened if possible, as in a named pipe).
+ */
+ pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
+ RL(nfds = poll(&pfd, 1, 0));
+ ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
+ ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
+ pollhup|POLLIN,
+ "revents=0x%x expected=0x%x"
+ " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
+ pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
+}
+
+static void *
+pollclosed_fifo_writer_thread(void *cookie)
+{
+ int *pp = cookie;
+
+ RL(*pp = open(fifo_path, O_WRONLY));
+ return NULL;
+}
+
+static void *
+pollclosed_fifo_reader_thread(void *cookie)
+{
+ int *pp = cookie;
+
+ RL(*pp = open(fifo_path, O_RDONLY));
+ return NULL;
+}
+
+static void
+pollclosed_fifo0_setup(int *writefdp, int *readfdp)
+{
+ int p0, p1;
+ pthread_t t;
+
+ fifo_support();
+
+ RL(mkfifo(fifo_path, 0600));
+ RZ(pthread_create(&t, NULL, &pollclosed_fifo_reader_thread, &p0));
+ REQUIRE_LIBC(alarm(1), (unsigned)-1);
+ RL(p1 = open(fifo_path, O_WRONLY));
+ REQUIRE_LIBC(alarm(0), (unsigned)-1);
+ RZ(pthread_join(t, NULL));
+
+ *writefdp = p1;
+ *readfdp = p0;
+}
+
+static void
+pollclosed_fifo1_setup(int *writefdp, int *readfdp)
+{
+ int p0, p1;
+ pthread_t t;
+
+ fifo_support();
+
+ RL(mkfifo(fifo_path, 0600));
+ RZ(pthread_create(&t, NULL, &pollclosed_fifo_writer_thread, &p0));
+ REQUIRE_LIBC(alarm(1), (unsigned)-1);
+ RL(p1 = open(fifo_path, O_RDONLY));
+ REQUIRE_LIBC(alarm(0), (unsigned)-1);
+ RZ(pthread_join(t, NULL));
+
+ *writefdp = p0;
+ *readfdp = p1;
+}
+
+static void
+pollclosed_pipe_setup(int *writefdp, int *readfdp)
+{
+ int p[2];
+
+ RL(pipe(p));
+
+ *readfdp = p[0]; /* reader side */
+ *writefdp = p[1]; /* writer side */
+}
+
+static void
+pollclosed_ptyapp_setup(int *writefdp, int *readfdp)
+{
+ int hostfd, appfd;
+ struct termios t;
+ char *pts;
+
+ RL(hostfd = posix_openpt(O_RDWR|O_NOCTTY));
+ RL(grantpt(hostfd));
+ RL(unlockpt(hostfd));
+ REQUIRE_LIBC(pts = ptsname(hostfd), NULL);
+ RL(appfd = open(pts, O_RDWR|O_NOCTTY));
+
+ RL(tcgetattr(appfd, &t));
+ t.c_lflag &= ~ICANON; /* block rather than drop input */
+ RL(tcsetattr(appfd, TCSANOW, &t));
+
+ *readfdp = appfd;
+ *writefdp = hostfd;
+}
+
+static void
+pollclosed_ptyhost_setup(int *writefdp, int *readfdp)
+{
+ int hostfd, appfd;
+ struct termios t;
+ char *pts;
+
+ RL(hostfd = posix_openpt(O_RDWR|O_NOCTTY));
+ RL(grantpt(hostfd));
+ RL(unlockpt(hostfd));
+ REQUIRE_LIBC(pts = ptsname(hostfd), NULL);
+ RL(appfd = open(pts, O_RDWR|O_NOCTTY));
+
+ RL(tcgetattr(appfd, &t));
+ t.c_lflag &= ~ICANON; /* block rather than drop input */
+ RL(tcsetattr(appfd, TCSANOW, &t));
+
+ *writefdp = appfd;
+ *readfdp = hostfd;
+}
+
+static void
+pollclosed_socketpair0_setup(int *writefdp, int *readfdp)
+{
+ int s[2];
+
+ RL(socketpair(AF_LOCAL, SOCK_STREAM, 0, s));
+ *readfdp = s[0];
+ *writefdp = s[1];
+}
+
+static void
+pollclosed_socketpair1_setup(int *writefdp, int *readfdp)
+{
+ int s[2];
+
+ RL(socketpair(AF_LOCAL, SOCK_STREAM, 0, s));
+ *readfdp = s[1];
+ *writefdp = s[0];
+}
+
+/*
+ * Cartesian product of:
+ *
+ * 1. [fifo0] first fifo opener
+ * 2. [fifo1] second fifo opener
+ * 3. [pipe] pipe
+ * 4. [ptyhost] host side of pty
+ * 5. [ptyapp] application side of pty
+ * 6. [socketpair0] first side of socket pair
+ * 7. [socketpair1] second side of socket pair
+ *
+ * with
+ *
+ * 1. [immediate] closed before poll starts
+ * 2. [delayed_thread] closed by another thread after poll starts
+ * 3. [delayed_process] closed by another process after poll starts
+ *
+ * with
+ *
+ * 1. [writefull] close reader, poll for write when buffer full
+ * 2. [writeempty] close reader, poll for write when buffer empty
+ * 3. [readnone] close writer, poll for read when nothing to read
+ * 4. [readsome] close writer, poll for read when something to read
+ *
+ * except that in the delayed cases we only do writefull [write] and
+ * readnone [read], because there's no delay in the writeempty/readsome
+ * cases.
+ */
+
+ATF_TC(pollclosed_fifo0_immediate_writefull);
+ATF_TC_HEAD(pollclosed_fifo0_immediate_writefull, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_immediate_writefull, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo0_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_fifo0_immediate_writeempty);
+ATF_TC_HEAD(pollclosed_fifo0_immediate_writeempty, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_immediate_writeempty, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo0_setup(&writefd, &readfd);
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_fifo0_immediate_readsome);
+ATF_TC_HEAD(pollclosed_fifo0_immediate_readsome, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_immediate_readsome, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns nothing, when it is supposed to return
+ * POLLHUP|POLLIN.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_fifo0_immediate_readnone);
+ATF_TC_HEAD(pollclosed_fifo0_immediate_readnone, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_immediate_readnone, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_fifo0_delayed_process_write);
+ATF_TC_HEAD(pollclosed_fifo0_delayed_process_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_delayed_process_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo0_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_process(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_fifo0_delayed_process_read);
+ATF_TC_HEAD(pollclosed_fifo0_delayed_process_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_delayed_process_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
+ * persistent as it is supposed to be -- it returns nothing
+ * after that.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_fifo0_delayed_thread_write);
+ATF_TC_HEAD(pollclosed_fifo0_delayed_thread_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_delayed_thread_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo0_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_thread(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_fifo0_delayed_thread_read);
+ATF_TC_HEAD(pollclosed_fifo0_delayed_thread_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo0_delayed_thread_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
+ * persistent as it is supposed to be -- it returns nothing
+ * after that.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_thread(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_fifo1_immediate_writefull);
+ATF_TC_HEAD(pollclosed_fifo1_immediate_writefull, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_immediate_writefull, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo1_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_fifo1_immediate_writeempty);
+ATF_TC_HEAD(pollclosed_fifo1_immediate_writeempty, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_immediate_writeempty, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo1_setup(&writefd, &readfd);
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_fifo1_immediate_readsome);
+ATF_TC_HEAD(pollclosed_fifo1_immediate_readsome, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_immediate_readsome, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns nothing, when it is supposed to return
+ * POLLHUP|POLLIN.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_fifo1_immediate_readnone);
+ATF_TC_HEAD(pollclosed_fifo1_immediate_readnone, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_immediate_readnone, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_fifo1_delayed_process_write);
+ATF_TC_HEAD(pollclosed_fifo1_delayed_process_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_delayed_process_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo1_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_process(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_fifo1_delayed_process_read);
+ATF_TC_HEAD(pollclosed_fifo1_delayed_process_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_delayed_process_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
+ * persistent as it is supposed to be -- it returns nothing
+ * after that.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_fifo1_delayed_thread_write);
+ATF_TC_HEAD(pollclosed_fifo1_delayed_thread_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_delayed_thread_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_fifo1_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_thread(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_fifo1_delayed_thread_read);
+ATF_TC_HEAD(pollclosed_fifo1_delayed_thread_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second opener of a named pipe");
+}
+ATF_TC_BODY(pollclosed_fifo1_delayed_thread_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
+ * persistent as it is supposed to be -- it returns nothing
+ * after that.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_pipe_immediate_writefull);
+ATF_TC_HEAD(pollclosed_pipe_immediate_writefull, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_immediate_writefull, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
+ * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
+ * only supposed to be returned by polling for read, not
+ * polling for write. So it should be POLLOUT.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_pipe_immediate_writeempty);
+ATF_TC_HEAD(pollclosed_pipe_immediate_writeempty, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_immediate_writeempty, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
+ * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
+ * only supposed to be returned by polling for read, not
+ * polling for write. So it should be POLLOUT.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ /* don't fill pipe buf */
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_pipe_immediate_readsome);
+ATF_TC_HEAD(pollclosed_pipe_immediate_readsome, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_immediate_readsome, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_pipe_immediate_readnone);
+ATF_TC_HEAD(pollclosed_pipe_immediate_readnone, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_immediate_readnone, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ /* don't fill pipe buf */
+ check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_pipe_delayed_process_write);
+ATF_TC_HEAD(pollclosed_pipe_delayed_process_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_delayed_process_write, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
+ * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
+ * only supposed to be returned by polling for read, not
+ * polling for write. So it should be POLLOUT.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_process(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_pipe_delayed_process_read);
+ATF_TC_HEAD(pollclosed_pipe_delayed_process_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_delayed_process_read, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_pipe_delayed_thread_write);
+ATF_TC_HEAD(pollclosed_pipe_delayed_thread_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_delayed_thread_write, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
+ * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
+ * only supposed to be returned by polling for read, not
+ * polling for write. So it should be POLLOUT.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_thread(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_pipe_delayed_thread_read);
+ATF_TC_HEAD(pollclosed_pipe_delayed_thread_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with a closed pipe");
+}
+ATF_TC_BODY(pollclosed_pipe_delayed_thread_read, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_pipe_setup(&writefd, &readfd);
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_thread(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_ptyapp_immediate_writefull);
+ATF_TC_HEAD(pollclosed_ptyapp_immediate_writefull, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_immediate_writefull, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_ptyapp_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
+}
+
+ATF_TC(pollclosed_ptyapp_immediate_writeempty);
+ATF_TC_HEAD(pollclosed_ptyapp_immediate_writeempty, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_immediate_writeempty, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_ptyapp_setup(&writefd, &readfd);
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
+}
+
+ATF_TC(pollclosed_ptyapp_immediate_readsome);
+ATF_TC_HEAD(pollclosed_ptyapp_immediate_readsome, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_immediate_readsome, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_ptyapp_immediate_readnone);
+ATF_TC_HEAD(pollclosed_ptyapp_immediate_readnone, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_immediate_readnone, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_ptyapp_delayed_process_write);
+ATF_TC_HEAD(pollclosed_ptyapp_delayed_process_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_delayed_process_write, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * The poll(2) call is not woken by the concurrent close(2)
+ * call.
+ */
+ atf_tc_expect_signal(SIGALRM, "PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyapp_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_process(writefd, readfd,
+ &check_pollclosed_delayed_write_terminal);
+}
+
+ATF_TC(pollclosed_ptyapp_delayed_process_read);
+ATF_TC_HEAD(pollclosed_ptyapp_delayed_process_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_delayed_process_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_ptyapp_delayed_thread_write);
+ATF_TC_HEAD(pollclosed_ptyapp_delayed_thread_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_delayed_thread_write, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * The poll(2) call is not woken by the concurrent close(2)
+ * call.
+ */
+ atf_tc_expect_signal(SIGALRM, "PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyapp_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_thread(writefd, readfd,
+ &check_pollclosed_delayed_write_terminal);
+}
+
+ATF_TC(pollclosed_ptyapp_delayed_thread_read);
+ATF_TC_HEAD(pollclosed_ptyapp_delayed_thread_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty application side");
+}
+ATF_TC_BODY(pollclosed_ptyapp_delayed_thread_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_ptyhost_immediate_writefull);
+ATF_TC_HEAD(pollclosed_ptyhost_immediate_writefull, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_immediate_writefull, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_ptyhost_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
+}
+
+ATF_TC(pollclosed_ptyhost_immediate_writeempty);
+ATF_TC_HEAD(pollclosed_ptyhost_immediate_writeempty, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_immediate_writeempty, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_ptyhost_setup(&writefd, &readfd);
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
+}
+
+ATF_TC(pollclosed_ptyhost_immediate_readsome);
+ATF_TC_HEAD(pollclosed_ptyhost_immediate_readsome, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_immediate_readsome, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_ptyhost_immediate_readnone);
+ATF_TC_HEAD(pollclosed_ptyhost_immediate_readnone, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_immediate_readnone, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
+}
+
+ATF_TC(pollclosed_ptyhost_delayed_process_write);
+ATF_TC_HEAD(pollclosed_ptyhost_delayed_process_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_delayed_process_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_ptyhost_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_process(writefd, readfd,
+ &check_pollclosed_delayed_write_terminal);
+}
+
+ATF_TC(pollclosed_ptyhost_delayed_process_read);
+ATF_TC_HEAD(pollclosed_ptyhost_delayed_process_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_delayed_process_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_ptyhost_delayed_thread_write);
+ATF_TC_HEAD(pollclosed_ptyhost_delayed_thread_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_delayed_thread_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_ptyhost_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_thread(writefd, readfd,
+ &check_pollclosed_delayed_write_terminal);
+}
+
+ATF_TC(pollclosed_ptyhost_delayed_thread_read);
+ATF_TC_HEAD(pollclosed_ptyhost_delayed_thread_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the pty host side");
+}
+ATF_TC_BODY(pollclosed_ptyhost_delayed_thread_read, tc)
+{
+ int writefd, readfd;
+
+ /*
+ * poll(2) returns POLLHUP but not POLLIN even though read(2)
+ * would return EOF without blocking.
+ */
+ atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
+
+ pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_thread(readfd, writefd,
+ &check_pollclosed_delayed_read_devfifopipe);
+}
+
+ATF_TC(pollclosed_socketpair0_immediate_writefull);
+ATF_TC_HEAD(pollclosed_socketpair0_immediate_writefull, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_immediate_writefull, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_socketpair0_immediate_writeempty);
+ATF_TC_HEAD(pollclosed_socketpair0_immediate_writeempty, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_immediate_writeempty, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd);
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_socketpair0_immediate_readsome);
+ATF_TC_HEAD(pollclosed_socketpair0_immediate_readsome, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_immediate_readsome, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_readsome(readfd, writefd, /*no POLLHUP*/0);
+}
+
+ATF_TC(pollclosed_socketpair0_immediate_readnone);
+ATF_TC_HEAD(pollclosed_socketpair0_immediate_readnone, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_immediate_readnone, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_readnone(readfd, writefd, /*no POLLHUP*/0);
+}
+
+ATF_TC(pollclosed_socketpair0_delayed_process_write);
+ATF_TC_HEAD(pollclosed_socketpair0_delayed_process_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_delayed_process_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_process(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_socketpair0_delayed_process_read);
+ATF_TC_HEAD(pollclosed_socketpair0_delayed_process_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_delayed_process_read, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_socket);
+}
+
+ATF_TC(pollclosed_socketpair0_delayed_thread_write);
+ATF_TC_HEAD(pollclosed_socketpair0_delayed_thread_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_delayed_thread_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_thread(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_socketpair0_delayed_thread_read);
+ATF_TC_HEAD(pollclosed_socketpair0_delayed_thread_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the first half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair0_delayed_thread_read, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_thread(readfd, writefd,
+ &check_pollclosed_delayed_read_socket);
+}
+
+ATF_TC(pollclosed_socketpair1_immediate_writefull);
+ATF_TC_HEAD(pollclosed_socketpair1_immediate_writefull, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_immediate_writefull, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_socketpair1_immediate_writeempty);
+ATF_TC_HEAD(pollclosed_socketpair1_immediate_writeempty, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_immediate_writeempty, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd);
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
+}
+
+ATF_TC(pollclosed_socketpair1_immediate_readsome);
+ATF_TC_HEAD(pollclosed_socketpair1_immediate_readsome, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_immediate_readsome, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
+ fillpipebuf(writefd);
+ check_pollclosed_immediate_readsome(readfd, writefd, /*no POLLHUP*/0);
+}
+
+ATF_TC(pollclosed_socketpair1_immediate_readnone);
+ATF_TC_HEAD(pollclosed_socketpair1_immediate_readnone, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_immediate_readnone, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill the pipe buf */
+ check_pollclosed_immediate_readnone(readfd, writefd, /*no POLLHUP*/0);
+}
+
+ATF_TC(pollclosed_socketpair1_delayed_process_write);
+ATF_TC_HEAD(pollclosed_socketpair1_delayed_process_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_delayed_process_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_process(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_socketpair1_delayed_process_read);
+ATF_TC_HEAD(pollclosed_socketpair1_delayed_process_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_delayed_process_read, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_socket);
+}
+
+ATF_TC(pollclosed_socketpair1_delayed_thread_write);
+ATF_TC_HEAD(pollclosed_socketpair1_delayed_thread_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_delayed_thread_write, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair1_setup(&writefd, &readfd);
+ fillpipebuf(writefd);
+ check_pollclosed_delayed_thread(writefd, readfd,
+ &check_pollclosed_delayed_write_fifopipesocket);
+}
+
+ATF_TC(pollclosed_socketpair1_delayed_thread_read);
+ATF_TC_HEAD(pollclosed_socketpair1_delayed_thread_read, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks POLLHUP with closing the second half of a socketpair");
+}
+ATF_TC_BODY(pollclosed_socketpair1_delayed_thread_read, tc)
+{
+ int writefd, readfd;
+
+ pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
+ /* don't fill pipe buf */
+ check_pollclosed_delayed_process(readfd, writefd,
+ &check_pollclosed_delayed_read_socket);
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -466,5 +2095,69 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, fifo_hup1);
ATF_TP_ADD_TC(tp, fifo_hup2);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_writefull);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_writefull);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_writefull);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_writefull);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_writefull);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_writefull);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_writefull);
+
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_writeempty);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_writeempty);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_writeempty);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_writeempty);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_writeempty);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_writeempty);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_writeempty);
+
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_readsome);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_readsome);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_readsome);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_readsome);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_readsome);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_readsome);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_readsome);
+
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_readnone);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_readnone);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_readnone);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_readnone);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_readnone);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_readnone);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_readnone);
+
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_process_write);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_process_write);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_process_write);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_process_write);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_process_write);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_process_write);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_process_write);
+
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_process_read);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_process_read);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_process_read);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_process_read);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_process_read);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_process_read);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_process_read);
+
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_thread_write);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_thread_write);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_thread_write);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_thread_write);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_thread_write);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_thread_write);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_thread_write);
+
+ ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_thread_read);
+ ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_thread_read);
+ ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_thread_read);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_thread_read);
+ ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_thread_read);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_thread_read);
+ ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_thread_read);
+
return atf_no_error();
}
diff --git a/lib/libc/sys/t_posix_fadvise.c b/lib/libc/sys/t_posix_fadvise.c
index fa8815896e8f..c3ba3909fe63 100644
--- a/lib/libc/sys/t_posix_fadvise.c
+++ b/lib/libc/sys/t_posix_fadvise.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_posix_fadvise.c,v 1.3 2018/06/19 09:20:46 gson Exp $ */
+/* $NetBSD: t_posix_fadvise.c,v 1.4 2025/04/06 19:18:00 riastradh Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_posix_fadvise.c,v 1.3 2018/06/19 09:20:46 gson Exp $");
+__RCSID("$NetBSD: t_posix_fadvise.c,v 1.4 2025/04/06 19:18:00 riastradh Exp $");
#include <sys/fcntl.h>
@@ -103,15 +103,12 @@ ATF_TC_BODY(posix_fadvise, tc)
* only check return values here.
*/
- /* posix_fadvise shouldn't affect errno. */
-
#define CE(x, exp) \
do { \
- int save = errno; \
- errno = 999; \
- ATF_CHECK_EQ_MSG(ret = (x), exp, "got: %d", ret); \
- ATF_CHECK_EQ_MSG(errno, 999, "got: %s", strerror(errno)); \
- errno = save; \
+ ATF_CHECK_EQ_MSG(ret = (x), (exp), \
+ "got %d (%s), expected %d (%s)", \
+ ret, strerror(ret), \
+ (exp), strerror(exp)); \
} while (0)
CE(posix_fadvise(fd, 0, 0, -1), EINVAL);
diff --git a/lib/libc/sys/t_ptrace.c b/lib/libc/sys/t_ptrace.c
index 3def2468c3a7..8a6e1134290c 100644
--- a/lib/libc/sys/t_ptrace.c
+++ b/lib/libc/sys/t_ptrace.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace.c,v 1.5 2022/05/24 20:08:38 andvar Exp $ */
+/* $NetBSD: t_ptrace.c,v 1.7 2025/05/02 02:24:44 riastradh Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ptrace.c,v 1.5 2022/05/24 20:08:38 andvar Exp $");
+__RCSID("$NetBSD: t_ptrace.c,v 1.7 2025/05/02 02:24:44 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -50,20 +50,31 @@ __RCSID("$NetBSD: t_ptrace.c,v 1.5 2022/05/24 20:08:38 andvar Exp $");
* overcomplicate the tests - do not log from a child and use err(3)/errx(3)
* wrapped with FORKEE_ASSERT()/FORKEE_ASSERTX() as that is guaranteed to work.
*/
-#define FORKEE_ASSERTX(x) \
-do { \
- int ret = (x); \
- if (!ret) \
- errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s", \
- __FILE__, __LINE__, __func__, #x); \
+#define FORKEE_ASSERTX(x) \
+do { \
+ int ret = (x); \
+ if (!ret) \
+ errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s", \
+ __FILE__, __LINE__, __func__, #x); \
} while (0)
-#define FORKEE_ASSERT(x) \
-do { \
- int ret = (x); \
- if (!ret) \
- err(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s", \
- __FILE__, __LINE__, __func__, #x); \
+#define FORKEE_ASSERT(x) \
+do { \
+ int ret = (x); \
+ if (!ret) \
+ err(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: %s", \
+ __FILE__, __LINE__, __func__, #x); \
+} while (0)
+
+#define FORKEE_ASSERT_EQ(x, y) \
+do { \
+ uintmax_t vx = (x); \
+ uintmax_t vy = (y); \
+ int ret = vx == vy; \
+ if (!ret) \
+ errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: " \
+ "%s(%ju) == %s(%ju)", __FILE__, __LINE__, __func__, \
+ #x, vx, #y, vy); \
} while (0)
ATF_TC(attach_pid0);
@@ -108,8 +119,7 @@ ATF_TC_BODY(attach_pid1_securelevel, tc)
int level;
size_t len = sizeof(level);
- ATF_REQUIRE(sysctlbyname("kern.securelevel", &level, &len, NULL, 0)
- != -1);
+ RL(sysctlbyname("kern.securelevel", &level, &len, NULL, 0));
if (level < 0) {
atf_tc_skip("Test must be run with securelevel >= 0");
@@ -139,7 +149,7 @@ ATF_TC_HEAD(attach_chroot, tc)
"root");
atf_tc_set_md_var(tc, "require.user", "root");
-}
+}
ATF_TC_BODY(attach_chroot, tc)
{
@@ -150,14 +160,14 @@ ATF_TC_BODY(attach_chroot, tc)
uint8_t msg = 0xde; /* dummy message for IPC based on pipe(2) */
(void)memset(buf, '\0', sizeof(buf));
- ATF_REQUIRE(getcwd(buf, sizeof(buf)) != NULL);
+ REQUIRE_LIBC(getcwd(buf, sizeof(buf)), NULL);
(void)strlcat(buf, "/dir", sizeof(buf));
- ATF_REQUIRE(mkdir(buf, 0500) == 0);
- ATF_REQUIRE(chdir(buf) == 0);
+ RL(mkdir(buf, 0500));
+ RL(chdir(buf));
- ATF_REQUIRE(pipe(fds_toparent) == 0);
- ATF_REQUIRE(pipe(fds_fromparent) == 0);
+ RL(pipe(fds_toparent));
+ RL(pipe(fds_fromparent));
child = atf_utils_fork();
if (child == 0) {
FORKEE_ASSERT(close(fds_toparent[0]) == 0);
@@ -165,33 +175,40 @@ ATF_TC_BODY(attach_chroot, tc)
FORKEE_ASSERT(chroot(buf) == 0);
- rv = write(fds_toparent[1], &msg, sizeof(msg));
- FORKEE_ASSERTX(rv == sizeof(msg));
+ FORKEE_ASSERT((rv = write(fds_toparent[1], &msg, sizeof(msg)))
+ != -1);
+ FORKEE_ASSERT_EQ(rv, sizeof(msg));
- ATF_REQUIRE_ERRNO(EPERM,
- ptrace(PT_ATTACH, getppid(), NULL, 0) == -1);
+ if (ptrace(PT_ATTACH, getppid(), NULL, 0) == 0) {
+ errx(EXIT_FAILURE, "%s unexpectedly succeeded",
+ "ptrace(PT_ATTACH, getppid(), NULL, 0)");
+ } else if (errno != EPERM) {
+ err(EXIT_FAILURE, "%s failed but not with EPERM",
+ "ptrace(PT_ATTACH, getppid(), NULL, 0)");
+ }
- rv = read(fds_fromparent[0], &msg, sizeof(msg));
- FORKEE_ASSERTX(rv == sizeof(msg));
+ FORKEE_ASSERT((rv = read(fds_fromparent[0], &msg, sizeof(msg)))
+ != -1);
+ FORKEE_ASSERT_EQ(rv, sizeof(msg));
_exit(0);
}
- ATF_REQUIRE(close(fds_toparent[1]) == 0);
- ATF_REQUIRE(close(fds_fromparent[0]) == 0);
+ RL(close(fds_toparent[1]));
+ RL(close(fds_fromparent[0]));
printf("Waiting for chrooting of the child PID %d", child);
- rv = read(fds_toparent[0], &msg, sizeof(msg));
- ATF_REQUIRE(rv == sizeof(msg));
+ RL(rv = read(fds_toparent[0], &msg, sizeof(msg)));
+ ATF_REQUIRE(rv == sizeof(msg));
printf("Child is ready, it will try to PT_ATTACH to parent\n");
- rv = write(fds_fromparent[1], &msg, sizeof(msg));
+ RL(rv = write(fds_fromparent[1], &msg, sizeof(msg)));
ATF_REQUIRE(rv == sizeof(msg));
printf("fds_fromparent is no longer needed - close it\n");
- ATF_REQUIRE(close(fds_fromparent[1]) == 0);
+ RL(close(fds_fromparent[1]));
printf("fds_toparent is no longer needed - close it\n");
- ATF_REQUIRE(close(fds_toparent[0]) == 0);
+ RL(close(fds_toparent[0]));
}
ATF_TC(traceme_twice);
@@ -206,7 +223,7 @@ ATF_TC_BODY(traceme_twice, tc)
printf("Mark the parent process (PID %d) a debugger of PID %d",
getppid(), getpid());
- ATF_REQUIRE(ptrace(PT_TRACE_ME, 0, NULL, 0) == 0);
+ RL(ptrace(PT_TRACE_ME, 0, NULL, 0));
printf("Mark the parent process (PID %d) a debugger of PID %d again",
getppid(), getpid());
diff --git a/lib/libc/sys/t_ptrace_amd64_wait.h b/lib/libc/sys/t_ptrace_amd64_wait.h
index 8f1ba708961a..1ad8fcc35123 100644
--- a/lib/libc/sys/t_ptrace_amd64_wait.h
+++ b/lib/libc/sys/t_ptrace_amd64_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_amd64_wait.h,v 1.12 2020/01/08 17:23:15 mgorny Exp $ */
+/* $NetBSD: t_ptrace_amd64_wait.h,v 1.13 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc.
@@ -113,7 +113,6 @@ ATF_TC_BODY(x86_64_regs1, tc)
/// ----------------------------------------------------------------------------
-
#define ATF_TP_ADD_TCS_PTRACE_WAIT_AMD64() \
ATF_TP_ADD_TC_HAVE_GPREGS(tp, x86_64_regs1);
#else
diff --git a/lib/libc/sys/t_ptrace_bytetransfer_wait.h b/lib/libc/sys/t_ptrace_bytetransfer_wait.h
index 6e1c7d3ec794..51f25a20e100 100644
--- a/lib/libc/sys/t_ptrace_bytetransfer_wait.h
+++ b/lib/libc/sys/t_ptrace_bytetransfer_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_bytetransfer_wait.h,v 1.1 2020/05/04 22:05:28 kamil Exp $ */
+/* $NetBSD: t_ptrace_bytetransfer_wait.h,v 1.2 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
enum bytes_transfer_type {
BYTES_TRANSFER_DATA,
BYTES_TRANSFER_DATAIO,
@@ -845,7 +844,6 @@ BYTES_TRANSFER_EOF(bytes_transfer_eof_piod_read_d, "PIOD_READ_D")
BYTES_TRANSFER_EOF(bytes_transfer_eof_piod_write_i, "PIOD_WRITE_I")
BYTES_TRANSFER_EOF(bytes_transfer_eof_piod_write_d, "PIOD_WRITE_D")
-
#define ATF_TP_ADD_TCS_PTRACE_WAIT_BYTETRANSFER() \
ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_8); \
ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_16); \
diff --git a/lib/libc/sys/t_ptrace_clone_wait.h b/lib/libc/sys/t_ptrace_clone_wait.h
index 47abcd8da05e..2b692df818aa 100644
--- a/lib/libc/sys/t_ptrace_clone_wait.h
+++ b/lib/libc/sys/t_ptrace_clone_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_clone_wait.h,v 1.3 2020/05/11 21:18:11 kamil Exp $ */
+/* $NetBSD: t_ptrace_clone_wait.h,v 1.4 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
static void
clone_body(int flags, bool trackfork, bool trackvfork,
bool trackvforkdone)
diff --git a/lib/libc/sys/t_ptrace_core_wait.h b/lib/libc/sys/t_ptrace_core_wait.h
index 5e5d06648076..7e0d84679b0e 100644
--- a/lib/libc/sys/t_ptrace_core_wait.h
+++ b/lib/libc/sys/t_ptrace_core_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_core_wait.h,v 1.7 2022/06/09 17:39:21 skrll Exp $ */
+/* $NetBSD: t_ptrace_core_wait.h,v 1.10 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
/*
* Parse the core file and find the requested note. If the reading or parsing
* fails, the test is failed. If the note is found, it is read onto buf, up to
@@ -209,7 +208,8 @@ ATF_TC_BODY(core_dump_procinfo, tc)
"without signal to be sent\n");
#if defined(__aarch64__) || defined(__arm__) || defined(__hppa__) || \
- defined(__powerpc__) || defined(__sh3__) || defined(sparc)
+ defined(__powerpc__) || defined(__riscv__) || defined(__sh3__) || \
+ defined(sparc) || defined(__vax__)
/*
* For these archs, program counter is not automatically incremented
* by a trap instruction. We cannot increment PC in the trap handler,
diff --git a/lib/libc/sys/t_ptrace_eventmask_wait.h b/lib/libc/sys/t_ptrace_eventmask_wait.h
index b92226459a70..561dd34ecb64 100644
--- a/lib/libc/sys/t_ptrace_eventmask_wait.h
+++ b/lib/libc/sys/t_ptrace_eventmask_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_eventmask_wait.h,v 1.1 2020/05/05 00:01:14 kamil Exp $ */
+/* $NetBSD: t_ptrace_eventmask_wait.h,v 1.2 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
static void
eventmask_preserved(int event)
{
diff --git a/lib/libc/sys/t_ptrace_fork_wait.h b/lib/libc/sys/t_ptrace_fork_wait.h
index 08c523d6706d..cb9795ca7e75 100644
--- a/lib/libc/sys/t_ptrace_fork_wait.h
+++ b/lib/libc/sys/t_ptrace_fork_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_fork_wait.h,v 1.7 2020/06/09 00:28:57 kamil Exp $ */
+/* $NetBSD: t_ptrace_fork_wait.h,v 1.8 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
static void
fork_body(const char *fn, bool trackspawn, bool trackfork, bool trackvfork,
bool trackvforkdone, bool newpgrp)
@@ -563,7 +562,7 @@ unrelated_tracer_fork_body(const char *fn, bool trackspawn, bool trackfork,
"and without signal to be sent\n");
SYSCALL_REQUIRE(
ptrace(PT_CONTINUE, tracee2, (void *)1, 0) != -1);
-
+
DPRINTF("Before resuming the tracee process where it left off "
"and without signal to be sent\n");
SYSCALL_REQUIRE(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
@@ -590,7 +589,6 @@ unrelated_tracer_fork_body(const char *fn, bool trackspawn, bool trackfork,
SYSCALL_REQUIRE(ptrace(PT_CONTINUE, tracee, (void *)1, 0) != -1);
}
-
if ((trackspawn && strcmp(fn, "spawn") == 0) ||
(trackfork && strcmp(fn, "fork") == 0) ||
(trackvfork && strcmp(fn, "vfork") == 0)) {
@@ -845,7 +843,7 @@ fork_detach_forker_body(const char *fn, bool kill_process)
op = PTRACE_FORK;
else
op = PTRACE_VFORK;
-
+
ATF_REQUIRE_EQ(state.pe_report_event & op, op);
ATF_REQUIRE_EQ(state.pe_other_pid, child);
diff --git a/lib/libc/sys/t_ptrace_lwp_wait.h b/lib/libc/sys/t_ptrace_lwp_wait.h
index e101cef369ff..c56b477a9aef 100644
--- a/lib/libc/sys/t_ptrace_lwp_wait.h
+++ b/lib/libc/sys/t_ptrace_lwp_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_lwp_wait.h,v 1.1 2020/05/05 00:15:45 kamil Exp $ */
+/* $NetBSD: t_ptrace_lwp_wait.h,v 1.2 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
static int lwpinfo_thread_sigmask[] = {SIGXCPU, SIGPIPE, SIGALRM, SIGURG};
static pthread_mutex_t lwpinfo_thread_mtx = PTHREAD_MUTEX_INITIALIZER;
diff --git a/lib/libc/sys/t_ptrace_register_wait.h b/lib/libc/sys/t_ptrace_register_wait.h
index 71efc69c72c0..f5c78fbd91cb 100644
--- a/lib/libc/sys/t_ptrace_register_wait.h
+++ b/lib/libc/sys/t_ptrace_register_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_register_wait.h,v 1.4 2021/10/14 13:50:36 gson Exp $ */
+/* $NetBSD: t_ptrace_register_wait.h,v 1.5 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
#if defined(HAVE_GPREGS) || defined(HAVE_FPREGS)
static void
access_regs(const char *regset, const char *aux)
diff --git a/lib/libc/sys/t_ptrace_sigchld.c b/lib/libc/sys/t_ptrace_sigchld.c
index 095cd85cc82c..f8de9cc0a8f6 100644
--- a/lib/libc/sys/t_ptrace_sigchld.c
+++ b/lib/libc/sys/t_ptrace_sigchld.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_sigchld.c,v 1.3 2020/05/05 18:12:20 kamil Exp $ */
+/* $NetBSD: t_ptrace_sigchld.c,v 1.7 2025/05/02 02:37:07 riastradh Exp $ */
/*-
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ptrace_sigchld.c,v 1.3 2020/05/05 18:12:20 kamil Exp $");
+__RCSID("$NetBSD: t_ptrace_sigchld.c,v 1.7 2025/05/02 02:37:07 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -73,9 +73,14 @@ __RCSID("$NetBSD: t_ptrace_sigchld.c,v 1.3 2020/05/05 18:12:20 kamil Exp $");
static int debug = 0;
#define DPRINTF(a, ...) do \
- if (debug) \
- printf("%s() %d.%d %s:%d " a, \
- __func__, getpid(), _lwp_self(), __FILE__, __LINE__, ##__VA_ARGS__); \
+ if (debug) { \
+ const char *file = __FILE__, *slash = strrchr(file, '/'); \
+ if (slash) \
+ file = slash + 1; \
+ printf("%s() %d.%d %s:%d " a, \
+ __func__, getpid(), _lwp_self(), file, __LINE__, \
+ ##__VA_ARGS__); \
+ } \
while (/*CONSTCOND*/0)
/// ----------------------------------------------------------------------------
@@ -166,7 +171,7 @@ traceme_raise(int sigval)
break;
default:
break;
- }
+ }
PARENT_TO_CHILD("raise1 child", parent_child, msg);
diff --git a/lib/libc/sys/t_ptrace_siginfo_wait.h b/lib/libc/sys/t_ptrace_siginfo_wait.h
index 07f817ca05ae..20a0e4167b21 100644
--- a/lib/libc/sys/t_ptrace_siginfo_wait.h
+++ b/lib/libc/sys/t_ptrace_siginfo_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_siginfo_wait.h,v 1.1 2020/05/05 00:57:34 kamil Exp $ */
+/* $NetBSD: t_ptrace_siginfo_wait.h,v 1.2 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,9 +26,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
static void
-ptrace_siginfo(bool faked, void (*sah)(int a, siginfo_t *b, void *c), int *signal_caught)
+ptrace_siginfo(bool faked, void (*sah)(int a, siginfo_t *b, void *c),
+ int *signal_caught)
{
const int exitval = 5;
const int sigval = SIGINT;
diff --git a/lib/libc/sys/t_ptrace_signal_wait.h b/lib/libc/sys/t_ptrace_signal_wait.h
index 945cab5c2249..be058c824742 100644
--- a/lib/libc/sys/t_ptrace_signal_wait.h
+++ b/lib/libc/sys/t_ptrace_signal_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_signal_wait.h,v 1.5 2021/03/19 00:44:09 simonb Exp $ */
+/* $NetBSD: t_ptrace_signal_wait.h,v 1.10 2025/05/14 12:16:13 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,6 +26,41 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+/* XXX copied from include/fenv.h -- factor me out, please! */
+#if \
+ (defined(__arm__) && defined(__SOFTFP__)) || \
+ (defined(__m68k__) && !defined(__HAVE_68881__)) || \
+ defined(__mips_soft_float) || \
+ (defined(__powerpc__) && defined(_SOFT_FLOAT)) || \
+ (defined(__sh__) && !defined(__SH_FPU_ANY__)) || \
+ 0
+#define SOFTFLOAT
+#endif
+
+#ifdef SOFTFLOAT
+static void
+softfloat_fudge_sigs(const ki_sigset_t *kbefore, ki_sigset_t *kafter)
+{
+ sigset_t before, after;
+
+ /*
+ * XXX Would be nice if the layout of ki_sigset_t were publicly
+ * documented!
+ */
+ __CTASSERT(sizeof(before) == sizeof(*kbefore));
+ __CTASSERT(sizeof(after) == sizeof(*kafter));
+ memcpy(&before, kbefore, sizeof(before));
+ memcpy(&after, kafter, sizeof(after));
+ if (sigismember(&before, SIGFPE)) {
+ fprintf(stderr, "%s: add SIGFPE\n", __func__);
+ sigaddset(&after, SIGFPE);
+ } else {
+ fprintf(stderr, "%s: del SIGFPE\n", __func__);
+ sigdelset(&after, SIGFPE);
+ }
+ memcpy(kafter, &after, sizeof(after));
+}
+#endif
static void
traceme_raise(int sigval)
@@ -43,7 +78,7 @@ traceme_raise(int sigval)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -87,13 +122,13 @@ traceme_raise(int sigval)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Assert that PT_GET_PROCESS_STATE returns non-error\n");
SYSCALL_REQUIRE(
ptrace(PT_GET_PROCESS_STATE, child, &state, slen) != -1);
- ATF_REQUIRE(memcmp(&state, &zero_state, slen) == 0);
+ TEST_CHECK_MEMEQ(&state, &zero_state, slen);
DPRINTF("Before resuming the child process where it left off "
"and without signal to be sent\n");
@@ -151,7 +186,7 @@ traceme_raisesignal_ignored(int sigignored)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -187,8 +222,8 @@ traceme_raisesignal_ignored(int sigignored)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and "
"without signal to be sent\n");
@@ -208,8 +243,8 @@ traceme_raisesignal_ignored(int sigignored)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigignored);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigignored);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and "
"without signal to be sent\n");
@@ -266,7 +301,7 @@ traceme_raisesignal_masked(int sigmasked)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -301,8 +336,8 @@ traceme_raisesignal_masked(int sigmasked)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and "
"without signal to be sent\n");
@@ -364,7 +399,7 @@ traceme_crash(int sig)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -410,23 +445,25 @@ traceme_crash(int sig)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sig);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sig);
switch (sig) {
case SIGTRAP:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_BRKPT);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, TRAP_BRKPT);
break;
case SIGSEGV:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
break;
case SIGILL:
- ATF_REQUIRE(info.psi_siginfo.si_code >= ILL_ILLOPC &&
- info.psi_siginfo.si_code <= ILL_BADSTK);
+ ATF_CHECK_MSG((info.psi_siginfo.si_code >= ILL_ILLOPC &&
+ info.psi_siginfo.si_code <= ILL_BADSTK),
+ "info.psi_siginfo.si_code=%d ILL_ILLOPC=%d ILL_BADSTK=%d",
+ info.psi_siginfo.si_code, ILL_ILLOPC, ILL_BADSTK);
break;
case SIGFPE:
-// XXXQEMU ATF_REQUIRE_EQ(info.psi_siginfo.si_code, FPE_FLTDIV);
+// XXXQEMU TEST_CHECK_EQ(info.psi_siginfo.si_code, FPE_FLTDIV);
break;
case SIGBUS:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, BUS_ADRERR);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, BUS_ADRERR);
break;
}
@@ -488,10 +525,19 @@ traceme_signalmasked_crash(int sig)
if (sig == SIGFPE && !are_fpu_exceptions_supported())
atf_tc_skip("FP exceptions are not supported");
+#ifdef SOFTFLOAT
+ /*
+ * Let's try to track down the dregs of PR misc/56820: Many FPE
+ * related tests fail on softfloat machines.
+ */
+ if (sig == SIGFPE)
+ debug = 1;
+#endif
+
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -542,7 +588,7 @@ traceme_signalmasked_crash(int sig)
name[4] = sizeof(kp);
name[5] = 1;
- ATF_REQUIRE_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
+ RL(sysctl(name, namelen, &kp, &len, NULL, 0));
kp_sigmask = kp.p_sigmask;
@@ -555,8 +601,8 @@ traceme_signalmasked_crash(int sig)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and "
"without signal to be sent\n");
@@ -576,7 +622,7 @@ traceme_signalmasked_crash(int sig)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
+ RL(sysctl(name, namelen, &kp, &len, NULL, 0));
DPRINTF("kp_sigmask="
"%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02" PRIx32"\n",
@@ -588,25 +634,54 @@ traceme_signalmasked_crash(int sig)
kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1],
kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]);
- ATF_REQUIRE(!memcmp(&kp_sigmask, &kp.p_sigmask, sizeof(kp_sigmask)));
+#ifdef SOFTFLOAT
+ /*
+ * Hardfloat floating-point exception traps raise SIGFPE even
+ * if the process has masked SIGFPE. As a side effect,
+ * delivery of the signal on trap unmasks it -- but as a
+ * special case, if the process is traced, it first stops and
+ * notifies the tracer _before_ unmasking SIGFPE and removing
+ * it from p_sigmask.
+ *
+ * Softfloat floating-point exception traps try to mimic this
+ * behaviour by sigprocmask and sigqueueinfo in userland, but
+ * it is difficult -- and likely not worthwhile -- to emulate
+ * the special case of a traced process. So when the tracer is
+ * notified of the child's signal, the child has _already_
+ * unmasked SIGFPE so it is no longer in p_sigmask. (See
+ * float_raise in lib/libc/softfloat/softfloat-specialize for
+ * details.)
+ *
+ * Since this is probably not worthwhile to address (it only
+ * affects an obscure detail of how the process state manifests
+ * to a debugger), we just pretend that SIGFPE didn't change in
+ * p_sigmask.
+ */
+ if (sig == SIGFPE)
+ softfloat_fudge_sigs(&kp_sigmask, &kp.p_sigmask);
+#endif
+
+ TEST_CHECK_MEMEQ(&kp_sigmask, &kp.p_sigmask, sizeof(kp_sigmask));
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sig);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sig);
switch (sig) {
case SIGTRAP:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_BRKPT);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, TRAP_BRKPT);
break;
case SIGSEGV:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
break;
case SIGILL:
- ATF_REQUIRE(info.psi_siginfo.si_code >= ILL_ILLOPC &&
- info.psi_siginfo.si_code <= ILL_BADSTK);
+ ATF_CHECK_MSG((info.psi_siginfo.si_code >= ILL_ILLOPC &&
+ info.psi_siginfo.si_code <= ILL_BADSTK),
+ "info.psi_siginfo.si_code=%d ILL_ILLOPC=%d ILL_BADSTK=%d",
+ info.psi_siginfo.si_code, ILL_ILLOPC, ILL_BADSTK);
break;
case SIGFPE:
-// XXXQEMU ATF_REQUIRE_EQ(info.psi_siginfo.si_code, FPE_FLTDIV);
+// XXXQEMU TEST_CHECK_EQ(info.psi_siginfo.si_code, FPE_FLTDIV);
break;
case SIGBUS:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, BUS_ADRERR);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, BUS_ADRERR);
break;
}
@@ -669,10 +744,19 @@ traceme_signalignored_crash(int sig)
if (sig == SIGFPE && !are_fpu_exceptions_supported())
atf_tc_skip("FP exceptions are not supported");
+#ifdef SOFTFLOAT
+ /*
+ * Let's try to track down the dregs of PR misc/56820: Many FPE
+ * related tests fail on softfloat machines.
+ */
+ if (sig == SIGFPE)
+ debug = 1;
+#endif
+
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -725,7 +809,7 @@ traceme_signalignored_crash(int sig)
name[4] = sizeof(kp);
name[5] = 1;
- ATF_REQUIRE_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
+ RL(sysctl(name, namelen, &kp, &len, NULL, 0));
kp_sigignore = kp.p_sigignore;
@@ -738,8 +822,8 @@ traceme_signalignored_crash(int sig)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and "
"without signal to be sent\n");
@@ -759,7 +843,7 @@ traceme_signalignored_crash(int sig)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(sysctl(name, namelen, &kp, &len, NULL, 0), 0);
+ RL(sysctl(name, namelen, &kp, &len, NULL, 0));
DPRINTF("kp_sigignore="
"%#02" PRIx32 "%02" PRIx32 "%02" PRIx32 "%02" PRIx32"\n",
@@ -771,25 +855,55 @@ traceme_signalignored_crash(int sig)
kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1],
kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]);
- ATF_REQUIRE(!memcmp(&kp_sigignore, &kp.p_sigignore, sizeof(kp_sigignore)));
+#ifdef SOFTFLOAT
+ /*
+ * Hardfloat floating-point exception traps raise SIGFPE even
+ * if the process has set the signal disposition of SIGFPE to
+ * SIG_IGN. As a side effect, delivery of the signal on trap
+ * changes the disposition from SIG_IGN to SIG_DFL -- but as a
+ * special case, if the process is traced, it first stops and
+ * notifies the tracer _before_ changing the disposition and
+ * removing SIGFPE from p_sigignore.
+ *
+ * Softfloat floating-point exception traps try to mimic this
+ * behaviour by sigaction and sigqueueinfo in userland, but it
+ * is difficult -- and likely not worthwhile -- to emulate the
+ * special case of a traced process. So when the tracer is
+ * notified of the child's signal, its disposition has
+ * _already_ been changed to SIG_DFL and so SIGFPE is no longer
+ * in p_sigignore. (See float_raise in
+ * lib/libc/softfloat/softfloat-specialize for details.)
+ *
+ * Since this is probably not worthwhile to address (it only
+ * affects an obscure detail of how the process state manifests
+ * to a debugger), we just pretend that nothing changeed in
+ * whether SIGFPE is ignored or not.
+ */
+ if (sig == SIGFPE)
+ softfloat_fudge_sigs(&kp_sigignore, &kp.p_sigignore);
+#endif
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sig);
+ TEST_CHECK_MEMEQ(&kp_sigignore, &kp.p_sigignore, sizeof(kp_sigignore));
+
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sig);
switch (sig) {
case SIGTRAP:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, TRAP_BRKPT);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, TRAP_BRKPT);
break;
case SIGSEGV:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SEGV_MAPERR);
break;
case SIGILL:
- ATF_REQUIRE(info.psi_siginfo.si_code >= ILL_ILLOPC &&
- info.psi_siginfo.si_code <= ILL_BADSTK);
+ ATF_CHECK_MSG((info.psi_siginfo.si_code >= ILL_ILLOPC &&
+ info.psi_siginfo.si_code <= ILL_BADSTK),
+ "info.psi_siginfo.si_code=%d ILL_ILLOPC=%d ILL_BADSTK=%d",
+ info.psi_siginfo.si_code, ILL_ILLOPC, ILL_BADSTK);
break;
case SIGFPE:
-// XXXQEMU ATF_REQUIRE_EQ(info.psi_siginfo.si_code, FPE_FLTDIV);
+// XXXQEMU TEST_CHECK_EQ(info.psi_siginfo.si_code, FPE_FLTDIV);
break;
case SIGBUS:
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, BUS_ADRERR);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, BUS_ADRERR);
break;
}
@@ -842,7 +956,7 @@ traceme_sendsignal_handle(int sigsent, void (*sah)(int a), int *traceme_caught)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -877,8 +991,8 @@ traceme_sendsignal_handle(int sigsent, void (*sah)(int a), int *traceme_caught)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and with "
"signal %s to be sent\n", strsignal(sigsent));
@@ -945,7 +1059,7 @@ traceme_sendsignal_masked(int sigsent)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -975,8 +1089,8 @@ traceme_sendsignal_masked(int sigsent)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and with "
"signal %s to be sent\n", strsignal(sigsent));
@@ -1033,10 +1147,10 @@ traceme_sendsignal_ignored(int sigsent)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
-
+
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
memset(&sa, 0, sizeof(sa));
@@ -1065,8 +1179,8 @@ traceme_sendsignal_ignored(int sigsent)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and with "
"signal %s to be sent\n", strsignal(sigsent));
@@ -1137,7 +1251,7 @@ traceme_sendsignal_simple(int sigsent)
memset(&info, 0, sizeof(info));
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -1170,8 +1284,8 @@ traceme_sendsignal_simple(int sigsent)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off and with "
"signal %s to be sent\n", strsignal(sigsent));
@@ -1194,8 +1308,8 @@ traceme_sendsignal_simple(int sigsent)
info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
info.psi_siginfo.si_errno);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
- ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
+ TEST_CHECK_EQ(info.psi_siginfo.si_signo, sigval);
+ TEST_CHECK_EQ(info.psi_siginfo.si_code, SI_LWP);
DPRINTF("Before resuming the child process where it left off "
"and with signal %s to be sent\n", strsignal(sigsent));
@@ -1282,7 +1396,7 @@ traceme_vfork_raise(int sigval)
if (sigval == SIGSTOP) {
parent = getpid();
- watcher = fork();
+ RL(watcher = fork());
ATF_REQUIRE(watcher != 1);
if (watcher == 0) {
/* Double fork(2) trick to reparent to initproc */
@@ -1313,7 +1427,7 @@ traceme_vfork_raise(int sigval)
}
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = vfork()) != -1);
+ RL(child = vfork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -1422,7 +1536,7 @@ traceme_vfork_crash(int sig)
atf_tc_skip("FP exceptions are not supported");
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = vfork()) != -1);
+ RL(child = vfork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -1504,7 +1618,7 @@ traceme_vfork_signalmasked_crash(int sig)
atf_tc_skip("FP exceptions are not supported");
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = vfork()) != -1);
+ RL(child = vfork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -1590,7 +1704,7 @@ traceme_vfork_signalignored_crash(int sig)
atf_tc_skip("FP exceptions are not supported");
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = vfork()) != -1);
+ RL(child = vfork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
@@ -1857,8 +1971,20 @@ unrelated_tracer_sees_crash(int sig, bool masked, bool ignored)
kp.p_sigmask.__bits[0], kp.p_sigmask.__bits[1],
kp.p_sigmask.__bits[2], kp.p_sigmask.__bits[3]);
- FORKEE_ASSERTX(!memcmp(&kp_sigmask, &kp.p_sigmask,
- sizeof(kp_sigmask)));
+#ifdef SOFTFLOAT
+ /*
+ * See above in traceme_signalmasked_crash
+ * about the softfloat trap SIGFPE delivery
+ * quirk that requires us to fudge this test.
+ */
+ if (sig == SIGFPE) {
+ softfloat_fudge_sigs(&kp_sigmask,
+ &kp.p_sigmask);
+ }
+#endif
+
+ FORKEE_ASSERT_MEMEQ(&kp_sigmask, &kp.p_sigmask,
+ sizeof(kp_sigmask));
}
if (ignored) {
@@ -1874,8 +2000,20 @@ unrelated_tracer_sees_crash(int sig, bool masked, bool ignored)
kp.p_sigignore.__bits[0], kp.p_sigignore.__bits[1],
kp.p_sigignore.__bits[2], kp.p_sigignore.__bits[3]);
- FORKEE_ASSERTX(!memcmp(&kp_sigignore, &kp.p_sigignore,
- sizeof(kp_sigignore)));
+#ifdef SOFTFLOAT
+ /*
+ * See above in traceme_signalignored_crash
+ * about the softfloat trap SIGFPE delivery
+ * quirk that requires us to fudge this test.
+ */
+ if (sig == SIGFPE) {
+ softfloat_fudge_sigs(&kp_sigignore,
+ &kp.p_sigignore);
+ }
+#endif
+
+ FORKEE_ASSERT_MEMEQ(&kp_sigignore, &kp.p_sigignore,
+ sizeof(kp_sigignore));
}
switch (sig) {
@@ -2042,7 +2180,7 @@ ATF_TC_BODY(signal_mask_unrelated, tc)
sigset_t intmask;
DPRINTF("Before forking process PID=%d\n", getpid());
- SYSCALL_REQUIRE((child = fork()) != -1);
+ RL(child = fork());
if (child == 0) {
DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
diff --git a/lib/libc/sys/t_ptrace_syscall_wait.h b/lib/libc/sys/t_ptrace_syscall_wait.h
index bb6b4d431357..f7e0afde03fa 100644
--- a/lib/libc/sys/t_ptrace_syscall_wait.h
+++ b/lib/libc/sys/t_ptrace_syscall_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_syscall_wait.h,v 1.3 2023/03/20 11:19:30 hannken Exp $ */
+/* $NetBSD: t_ptrace_syscall_wait.h,v 1.4 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
static int test_syscall_caught;
static void
diff --git a/lib/libc/sys/t_ptrace_threads_wait.h b/lib/libc/sys/t_ptrace_threads_wait.h
index e87ba74cb99c..5beb0f159dad 100644
--- a/lib/libc/sys/t_ptrace_threads_wait.h
+++ b/lib/libc/sys/t_ptrace_threads_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_threads_wait.h,v 1.1 2020/05/05 00:50:39 kamil Exp $ */
+/* $NetBSD: t_ptrace_threads_wait.h,v 1.3 2025/05/02 02:24:44 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
#define TRACE_THREADS_NUM 100
static volatile int done;
@@ -292,8 +291,8 @@ threads_and_exec(void)
DPRINTF("Before raising %s from child\n", strsignal(sigval));
FORKEE_ASSERT(raise(sigval) == 0);
- FORKEE_ASSERT(pthread_create(&t, NULL,
- thread_and_exec_thread_cb, NULL) == 0);
+ FORKEE_PTHREAD(pthread_create(&t, NULL,
+ thread_and_exec_thread_cb, NULL));
for (;;)
continue;
@@ -566,7 +565,7 @@ ATF_TC_BODY(resume, tc)
FORKEE_ASSERT(raise(sigval) == 0);
DPRINTF("Before creating new thread in child\n");
- FORKEE_ASSERT(pthread_create(&t, NULL, resume_thread, NULL) == 0);
+ FORKEE_PTHREAD(pthread_create(&t, NULL, resume_thread, NULL));
pthread_barrier_wait(&barrier1_resume);
@@ -699,8 +698,8 @@ thread_concurrent_sig_handler(int sig)
{
void *tls_val = pthread_getspecific(thread_concurrent_key);
DPRINTF("Before increment, LWP %d tls_val=%p\n", _lwp_self(), tls_val);
- FORKEE_ASSERT(pthread_setspecific(thread_concurrent_key,
- (void*)((uintptr_t)tls_val + 1)) == 0);
+ FORKEE_PTHREAD(pthread_setspecific(thread_concurrent_key,
+ (void*)((uintptr_t)tls_val + 1)));
}
static void *
@@ -809,41 +808,40 @@ thread_concurrent_test(enum thread_concurrent_signal_handling signal_handle,
}
DPRINTF("Before starting threads from the child\n");
- FORKEE_ASSERT(pthread_barrier_init(
+ FORKEE_PTHREAD(pthread_barrier_init(
&thread_concurrent_barrier, NULL,
- breakpoint_threads + signal_threads + watchpoint_threads)
- == 0);
- FORKEE_ASSERT(pthread_key_create(&thread_concurrent_key, NULL)
- == 0);
+ breakpoint_threads + signal_threads + watchpoint_threads));
+ FORKEE_PTHREAD(pthread_key_create(&thread_concurrent_key,
+ NULL));
for (i = 0; i < signal_threads; i++) {
- FORKEE_ASSERT(pthread_create(&sig_threads[i], NULL,
+ FORKEE_PTHREAD(pthread_create(&sig_threads[i], NULL,
thread_concurrent_signals_thread,
- &signal_handle) == 0);
+ &signal_handle));
}
for (i = 0; i < breakpoint_threads; i++) {
- FORKEE_ASSERT(pthread_create(&bp_threads[i], NULL,
- thread_concurrent_breakpoint_thread, NULL) == 0);
+ FORKEE_PTHREAD(pthread_create(&bp_threads[i], NULL,
+ thread_concurrent_breakpoint_thread, NULL));
}
for (i = 0; i < watchpoint_threads; i++) {
- FORKEE_ASSERT(pthread_create(&wp_threads[i], NULL,
- thread_concurrent_watchpoint_thread, NULL) == 0);
+ FORKEE_PTHREAD(pthread_create(&wp_threads[i], NULL,
+ thread_concurrent_watchpoint_thread, NULL));
}
DPRINTF("Before joining threads from the child\n");
for (i = 0; i < watchpoint_threads; i++) {
- FORKEE_ASSERT(pthread_join(wp_threads[i], NULL) == 0);
+ FORKEE_PTHREAD(pthread_join(wp_threads[i], NULL));
}
for (i = 0; i < breakpoint_threads; i++) {
- FORKEE_ASSERT(pthread_join(bp_threads[i], NULL) == 0);
+ FORKEE_PTHREAD(pthread_join(bp_threads[i], NULL));
}
for (i = 0; i < signal_threads; i++) {
- FORKEE_ASSERT(pthread_join(sig_threads[i], NULL) == 0);
+ FORKEE_PTHREAD(pthread_join(sig_threads[i], NULL));
}
- FORKEE_ASSERT(pthread_key_delete(thread_concurrent_key) == 0);
- FORKEE_ASSERT(pthread_barrier_destroy(
- &thread_concurrent_barrier) == 0);
+ FORKEE_PTHREAD(pthread_key_delete(thread_concurrent_key));
+ FORKEE_PTHREAD(pthread_barrier_destroy(
+ &thread_concurrent_barrier));
DPRINTF("Before exiting of the child process\n");
_exit(exitval);
diff --git a/lib/libc/sys/t_ptrace_topology_wait.h b/lib/libc/sys/t_ptrace_topology_wait.h
index 01bfba0ba108..8bb58414823a 100644
--- a/lib/libc/sys/t_ptrace_topology_wait.h
+++ b/lib/libc/sys/t_ptrace_topology_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_topology_wait.h,v 1.1 2020/05/05 00:33:37 kamil Exp $ */
+/* $NetBSD: t_ptrace_topology_wait.h,v 1.2 2025/05/02 02:24:32 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -26,7 +26,6 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-
ATF_TC(traceme_pid1_parent);
ATF_TC_HEAD(traceme_pid1_parent, tc)
{
diff --git a/lib/libc/sys/t_ptrace_wait.c b/lib/libc/sys/t_ptrace_wait.c
index 69874423d2ee..a1cbcccdeb4a 100644
--- a/lib/libc/sys/t_ptrace_wait.c
+++ b/lib/libc/sys/t_ptrace_wait.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_wait.c,v 1.191 2020/05/05 02:06:08 kamil Exp $ */
+/* $NetBSD: t_ptrace_wait.c,v 1.196 2025/11/18 13:02:13 jkoshy Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ptrace_wait.c,v 1.191 2020/05/05 02:06:08 kamil Exp $");
+__RCSID("$NetBSD: t_ptrace_wait.c,v 1.196 2025/11/18 13:02:13 jkoshy Exp $");
#define __LEGACY_PT_LWPINFO
@@ -96,9 +96,14 @@ __CTASSERT(sizeof(((struct ptrace_state *)0)->pe_other_pid) ==
static int debug = 0;
#define DPRINTF(a, ...) do \
- if (debug) \
- printf("%s() %d.%d %s:%d " a, \
- __func__, getpid(), _lwp_self(), __FILE__, __LINE__, ##__VA_ARGS__); \
+ if (debug) { \
+ const char *file = __FILE__, *slash = strrchr(file, '/'); \
+ if (slash) \
+ file = slash + 1; \
+ printf("%s() %d.%d %s:%d " a, \
+ __func__, getpid(), _lwp_self(), file, __LINE__, \
+ ##__VA_ARGS__); \
+ } \
while (/*CONSTCOND*/0)
/// ----------------------------------------------------------------------------
diff --git a/lib/libc/sys/t_ptrace_wait.h b/lib/libc/sys/t_ptrace_wait.h
index 2e40a6533285..2cab30d122b6 100644
--- a/lib/libc/sys/t_ptrace_wait.h
+++ b/lib/libc/sys/t_ptrace_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_wait.h,v 1.34 2022/05/24 20:08:38 andvar Exp $ */
+/* $NetBSD: t_ptrace_wait.h,v 1.42 2025/05/09 01:32:25 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc.
@@ -135,8 +135,33 @@ do { \
uintmax_t vy = (y); \
int ret = vx == vy; \
if (!ret) \
- ATF_REQUIRE_EQ_MSG(vx, vy, "%s(%ju) == %s(%ju)", \
- #x, vx, #y, vy); \
+ ATF_REQUIRE_EQ_MSG(vx, vy, \
+ "%s(%ju=0x%jx) == %s(%ju=0x%jx)", \
+ #x, vx, vx, #y, vy, vy); \
+} while (/*CONSTCOND*/0)
+
+#define TEST_CHECK_EQ(x, y) \
+do { \
+ uintmax_t vx = (x); \
+ uintmax_t vy = (y); \
+ int ret = vx == vy; \
+ if (!ret) \
+ ATF_CHECK_EQ_MSG(vx, vy, \
+ "%s(%ju=0x%jx) == %s(%ju=0x%jx)", \
+ #x, vx, vx, #y, vy, vy); \
+} while (/*CONSTCOND*/0)
+
+#define TEST_CHECK_MEMEQ(x, y, n) \
+do { \
+ const void *vx = (x); \
+ const void *vy = (y); \
+ const size_t vn = (n); \
+ if (__predict_true(memcmp(vx, vy, vn) == 0)) \
+ break; \
+ hexdump(#x, vx, vn); \
+ hexdump(#y, vy, vn); \
+ atf_tc_fail_nonfatal("%s != %s (%s = %zu bytes)", \
+ #x, #y, #n, vn); \
} while (/*CONSTCOND*/0)
/*
@@ -154,8 +179,9 @@ do { \
int ret = vx == vy; \
if (!ret) \
errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: " \
- "%s(%ju) == %s(%ju)", __FILE__, __LINE__, __func__, \
- #x, vx, #y, vy); \
+ "%s(%jd=0x%jx) == %s(%jd=0x%jx)", \
+ __FILE__, __LINE__, __func__, \
+ #x, vx, vx, #y, vy, vy); \
} while (/*CONSTCOND*/0)
#define FORKEE_ASSERT_NEQ(x, y) \
@@ -165,8 +191,43 @@ do { \
int ret = vx != vy; \
if (!ret) \
errx(EXIT_FAILURE, "%s:%d %s(): Assertion failed for: " \
- "%s(%ju) != %s(%ju)", __FILE__, __LINE__, __func__, \
- #x, vx, #y, vy); \
+ "%s(%ju=0x%jx) != %s(%ju=0x%jx)", \
+ __FILE__, __LINE__, __func__, \
+ #x, vx, vx, #y, vy, vy); \
+} while (/*CONSTCOND*/0)
+
+__unused /* used by FORKEE_ASSERT_MEMEQ, otherwise not used */
+static void
+hexdump(const char *title, const void *buf, size_t len)
+{
+ const unsigned char *p = buf;
+ size_t i;
+
+ fprintf(stderr, "%s (%zu bytes)\n", title, len);
+ for (i = 0; i < len; i++) {
+ if ((i % 8) == 0)
+ fprintf(stderr, " ");
+ fprintf(stderr, " %02hhx", p[i]);
+ if ((i % 16) == 15)
+ fprintf(stderr, "\n");
+ }
+ if (i % 16)
+ fprintf(stderr, "\n");
+}
+
+#define FORKEE_ASSERT_MEMEQ(x, y, n) \
+do { \
+ const void *const vx = (x); \
+ const void *const vy = (y); \
+ const size_t vn = (n); \
+ \
+ if (__predict_true(memcmp(vx, vy, vn) == 0)) \
+ break; \
+ fprintf(stderr, "%s != %s (%s = %zu bytes)\n", #x, #y, #n, vn); \
+ hexdump(#x, vx, vn); \
+ hexdump(#y, vy, vn); \
+ errx(EXIT_FAILURE, "%s:%d %s(): failed", \
+ __FILE__, __LINE__, __func__); \
} while (/*CONSTCOND*/0)
#define FORKEE_ASSERTX(x) \
@@ -185,6 +246,16 @@ do { \
__FILE__, __LINE__, __func__, #x); \
} while (/*CONSTCOND*/0)
+#define FORKEE_PTHREAD(x) \
+do { \
+ int _forkee_pthread_error = (x); \
+ if (_forkee_pthread_error) { \
+ errno = _forkee_pthread_error; \
+ err(EXIT_FAILURE, "%s:%d %s(): %s", __FILE__, __LINE__, \
+ __func__, #x); \
+ } \
+} while (/*CONSTCOND*/0)
+
/*
* Simplify logic for functions using general purpose registers add HAVE_GPREGS
*
@@ -673,10 +744,14 @@ are_fpu_exceptions_supported(void)
return false;
return true;
}
+#elif defined __riscv__
+#define are_fpu_exceptions_supported() 0
#else
#define are_fpu_exceptions_supported() 1
#endif
+volatile double ignore_result;
+
static void __used
trigger_fpe(void)
{
@@ -701,7 +776,7 @@ trigger_fpe(void)
#endif
/* Division by zero causes CPU trap, translated to SIGFPE */
- usleep((int)(a / b));
+ ignore_result = (int)(a / b);
}
static void __used
@@ -750,7 +825,6 @@ find_event_count(struct lwp_event_count list[], lwpid_t lwp, size_t max_lwps)
#define FIND_EVENT_COUNT(list, lwp) \
find_event_count(list, lwp, __arraycount(list))
-
#if defined(TWAIT_HAVE_PID)
#define ATF_TP_ADD_TC_HAVE_PID(a,b) ATF_TP_ADD_TC(a,b)
#else
diff --git a/lib/libc/sys/t_ptrace_x86_wait.h b/lib/libc/sys/t_ptrace_x86_wait.h
index eb0e1928786f..05b2d71d5f80 100644
--- a/lib/libc/sys/t_ptrace_x86_wait.h
+++ b/lib/libc/sys/t_ptrace_x86_wait.h
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptrace_x86_wait.h,v 1.31 2020/10/27 08:32:36 mgorny Exp $ */
+/* $NetBSD: t_ptrace_x86_wait.h,v 1.33 2025/05/02 02:24:44 riastradh Exp $ */
/*-
* Copyright (c) 2016, 2017, 2018, 2019 The NetBSD Foundation, Inc.
@@ -92,7 +92,7 @@ ATF_TC_BODY(dbregs_print, tc)
DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
- validate_status_stopped(status, sigval);
+ validate_status_stopped(status, sigval);
DPRINTF("Call GETDBREGS for the child process\n");
SYSCALL_REQUIRE(ptrace(PT_GETDBREGS, child, &r, 0) != -1);
@@ -114,7 +114,6 @@ ATF_TC_BODY(dbregs_print, tc)
TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
}
-
enum dbreg_preserve_mode {
dbreg_preserve_mode_none,
dbreg_preserve_mode_yield,
@@ -222,7 +221,6 @@ dbreg_preserve(int reg, enum dbreg_preserve_mode mode)
TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
}
-
ATF_TC(dbregs_preserve_dr0);
ATF_TC_HEAD(dbregs_preserve_dr0, tc)
{
@@ -310,7 +308,6 @@ ATF_TC_BODY(dbregs_preserve_dr2_yield, tc)
dbreg_preserve(0, dbreg_preserve_mode_yield);
}
-
ATF_TC(dbregs_preserve_dr3_yield);
ATF_TC_HEAD(dbregs_preserve_dr3_yield, tc)
{
@@ -376,7 +373,6 @@ ATF_TC_BODY(dbregs_preserve_dr3_continued, tc)
dbreg_preserve(3, dbreg_preserve_mode_continued);
}
-
static void
dbregs_trap_variable(int reg, int cond, int len, bool write)
{
@@ -575,7 +571,7 @@ ATF_TC_BODY(dbregs_dr3_trap_variable_writeonly_byte, tc)
/* 0b00 -- 1 byte */
dbregs_trap_variable(3, 1, 0, true);
-}
+}
ATF_TC(dbregs_dr0_trap_variable_writeonly_2bytes);
ATF_TC_HEAD(dbregs_dr0_trap_variable_writeonly_2bytes, tc)
@@ -2015,7 +2011,7 @@ x86_cve_2018_8897_trigger(void)
*
* It means that, in the first instruction of the $4 handler, we
* think we are safe with interrupts disabled. But we aren't, and
- * just got interrupted.
+ * just got interrupted.
*
* The new interrupt handler doesn't handle this particular context:
* we are entered in kernel mode, the previous context was kernel
@@ -2093,7 +2089,6 @@ ATF_TC_BODY(x86_cve_2018_8897, tc)
#endif
char *trap_page;
struct dbreg db;
-
if (!can_we_set_dbregs()) {
atf_tc_skip("Either run this test as root or set sysctl(3) "
@@ -2469,8 +2464,8 @@ static __inline void get_fpu_regs(struct x86_test_fpu_registers *out)
: "st", "memory"
);
- FORKEE_ASSERT(fsave.s87_cw == fxsave.fx_cw);
- FORKEE_ASSERT(fsave.s87_sw == fxsave.fx_sw);
+ FORKEE_ASSERT_EQ(fsave.s87_cw, fxsave.fx_cw);
+ FORKEE_ASSERT_EQ(fsave.s87_sw, fxsave.fx_sw);
/* fsave contains full tw */
out->cw = fsave.s87_cw;
@@ -3283,230 +3278,238 @@ x86_register_test(enum x86_test_regset regset, enum x86_test_registers regs,
DPRINTF("Before comparing results\n");
switch (regs) {
case GPREGS_32:
- FORKEE_ASSERT(!memcmp(&vals[5].u32,
- &expected[5].u32, sizeof(vals->u32)));
- FORKEE_ASSERT(!memcmp(&vals[4].u32,
- &expected[4].u32, sizeof(vals->u32)));
- FORKEE_ASSERT(!memcmp(&vals[3].u32,
- &expected[3].u32, sizeof(vals->u32)));
- FORKEE_ASSERT(!memcmp(&vals[2].u32,
- &expected[2].u32, sizeof(vals->u32)));
+ FORKEE_ASSERT_MEMEQ(&vals[5].u32,
+ &expected[5].u32, sizeof(vals->u32));
+ FORKEE_ASSERT_MEMEQ(&vals[4].u32,
+ &expected[4].u32, sizeof(vals->u32));
+ FORKEE_ASSERT_MEMEQ(&vals[3].u32,
+ &expected[3].u32, sizeof(vals->u32));
+ FORKEE_ASSERT_MEMEQ(&vals[2].u32,
+ &expected[2].u32, sizeof(vals->u32));
/*FALLTHROUGH*/
case GPREGS_32_EBP_ESP:
- FORKEE_ASSERT(!memcmp(&vals[1].u32,
- &expected[1].u32, sizeof(vals->u32)));
- FORKEE_ASSERT(!memcmp(&vals[0].u32,
- &expected[0].u32, sizeof(vals->u32)));
+ FORKEE_ASSERT_MEMEQ(&vals[1].u32,
+ &expected[1].u32, sizeof(vals->u32));
+ FORKEE_ASSERT_MEMEQ(&vals[0].u32,
+ &expected[0].u32, sizeof(vals->u32));
break;
case GPREGS_64:
case GPREGS_64_R8:
case FPREGS_MM:
- FORKEE_ASSERT(!memcmp(&vals[0].u64,
- &expected[0].u64, sizeof(vals->u64)));
- FORKEE_ASSERT(!memcmp(&vals[1].u64,
- &expected[1].u64, sizeof(vals->u64)));
- FORKEE_ASSERT(!memcmp(&vals[2].u64,
- &expected[2].u64, sizeof(vals->u64)));
- FORKEE_ASSERT(!memcmp(&vals[3].u64,
- &expected[3].u64, sizeof(vals->u64)));
- FORKEE_ASSERT(!memcmp(&vals[4].u64,
- &expected[4].u64, sizeof(vals->u64)));
- FORKEE_ASSERT(!memcmp(&vals[5].u64,
- &expected[5].u64, sizeof(vals->u64)));
- FORKEE_ASSERT(!memcmp(&vals[6].u64,
- &expected[6].u64, sizeof(vals->u64)));
- FORKEE_ASSERT(!memcmp(&vals[7].u64,
- &expected[7].u64, sizeof(vals->u64)));
+ FORKEE_ASSERT_MEMEQ(&vals[0].u64,
+ &expected[0].u64, sizeof(vals->u64));
+ FORKEE_ASSERT_MEMEQ(&vals[1].u64,
+ &expected[1].u64, sizeof(vals->u64));
+ FORKEE_ASSERT_MEMEQ(&vals[2].u64,
+ &expected[2].u64, sizeof(vals->u64));
+ FORKEE_ASSERT_MEMEQ(&vals[3].u64,
+ &expected[3].u64, sizeof(vals->u64));
+ FORKEE_ASSERT_MEMEQ(&vals[4].u64,
+ &expected[4].u64, sizeof(vals->u64));
+ FORKEE_ASSERT_MEMEQ(&vals[5].u64,
+ &expected[5].u64, sizeof(vals->u64));
+ FORKEE_ASSERT_MEMEQ(&vals[6].u64,
+ &expected[6].u64, sizeof(vals->u64));
+ FORKEE_ASSERT_MEMEQ(&vals[7].u64,
+ &expected[7].u64, sizeof(vals->u64));
break;
case FPREGS_FPU:
- FORKEE_ASSERT(vals_fpu.cw == expected_fpu.cw);
- FORKEE_ASSERT(vals_fpu.sw == expected_fpu.sw);
- FORKEE_ASSERT(vals_fpu.tw == expected_fpu.tw);
- FORKEE_ASSERT(vals_fpu.tw_abridged
- == expected_fpu.tw_abridged);
- FORKEE_ASSERT(vals_fpu.ip.fa_64
- == expected_fpu.ip.fa_64);
- FORKEE_ASSERT(vals_fpu.dp.fa_64
- == expected_fpu.dp.fa_64);
+ FORKEE_ASSERT_EQ(vals_fpu.cw, expected_fpu.cw);
+ FORKEE_ASSERT_EQ(vals_fpu.sw, expected_fpu.sw);
+ FORKEE_ASSERT_EQ(vals_fpu.tw, expected_fpu.tw);
+ FORKEE_ASSERT_EQ(vals_fpu.tw_abridged,
+ expected_fpu.tw_abridged);
+ FORKEE_ASSERT_EQ(vals_fpu.ip.fa_64,
+ expected_fpu.ip.fa_64);
+ FORKEE_ASSERT_EQ(vals_fpu.dp.fa_64,
+ expected_fpu.dp.fa_64);
- FORKEE_ASSERT(vals_fpu.st[0].sign_exp
- == expected_fpu.st[0].sign_exp);
- FORKEE_ASSERT(vals_fpu.st[0].mantissa
- == expected_fpu.st[0].mantissa);
- FORKEE_ASSERT(vals_fpu.st[1].sign_exp
- == expected_fpu.st[1].sign_exp);
- FORKEE_ASSERT(vals_fpu.st[1].mantissa
- == expected_fpu.st[1].mantissa);
- FORKEE_ASSERT(vals_fpu.st[2].sign_exp
- == expected_fpu.st[2].sign_exp);
- FORKEE_ASSERT(vals_fpu.st[2].mantissa
- == expected_fpu.st[2].mantissa);
- FORKEE_ASSERT(vals_fpu.st[3].sign_exp
- == expected_fpu.st[3].sign_exp);
- FORKEE_ASSERT(vals_fpu.st[3].mantissa
- == expected_fpu.st[3].mantissa);
- FORKEE_ASSERT(vals_fpu.st[4].sign_exp
- == expected_fpu.st[4].sign_exp);
- FORKEE_ASSERT(vals_fpu.st[4].mantissa
- == expected_fpu.st[4].mantissa);
- FORKEE_ASSERT(vals_fpu.st[5].sign_exp
- == expected_fpu.st[5].sign_exp);
- FORKEE_ASSERT(vals_fpu.st[5].mantissa
- == expected_fpu.st[5].mantissa);
- FORKEE_ASSERT(vals_fpu.st[6].sign_exp
- == expected_fpu.st[6].sign_exp);
- FORKEE_ASSERT(vals_fpu.st[6].mantissa
- == expected_fpu.st[6].mantissa);
+ FORKEE_ASSERT_EQ(vals_fpu.st[0].sign_exp,
+ expected_fpu.st[0].sign_exp);
+ FORKEE_ASSERT_EQ(vals_fpu.st[0].mantissa,
+ expected_fpu.st[0].mantissa);
+ FORKEE_ASSERT_EQ(vals_fpu.st[1].sign_exp,
+ expected_fpu.st[1].sign_exp);
+ FORKEE_ASSERT_EQ(vals_fpu.st[1].mantissa,
+ expected_fpu.st[1].mantissa);
+ FORKEE_ASSERT_EQ(vals_fpu.st[2].sign_exp,
+ expected_fpu.st[2].sign_exp);
+ FORKEE_ASSERT_EQ(vals_fpu.st[2].mantissa,
+ expected_fpu.st[2].mantissa);
+ FORKEE_ASSERT_EQ(vals_fpu.st[3].sign_exp,
+ expected_fpu.st[3].sign_exp);
+ FORKEE_ASSERT_EQ(vals_fpu.st[3].mantissa,
+ expected_fpu.st[3].mantissa);
+ FORKEE_ASSERT_EQ(vals_fpu.st[4].sign_exp,
+ expected_fpu.st[4].sign_exp);
+ FORKEE_ASSERT_EQ(vals_fpu.st[4].mantissa,
+ expected_fpu.st[4].mantissa);
+ FORKEE_ASSERT_EQ(vals_fpu.st[5].sign_exp,
+ expected_fpu.st[5].sign_exp);
+ FORKEE_ASSERT_EQ(vals_fpu.st[5].mantissa,
+ expected_fpu.st[5].mantissa);
+ FORKEE_ASSERT_EQ(vals_fpu.st[6].sign_exp,
+ expected_fpu.st[6].sign_exp);
+ FORKEE_ASSERT_EQ(vals_fpu.st[6].mantissa,
+ expected_fpu.st[6].mantissa);
/* st(7) is left empty == undefined */
break;
case FPREGS_XMM:
- FORKEE_ASSERT(!memcmp(&vals[0].xmm,
- &expected[0].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[1].xmm,
- &expected[1].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[2].xmm,
- &expected[2].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[3].xmm,
- &expected[3].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[4].xmm,
- &expected[4].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[5].xmm,
- &expected[5].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[6].xmm,
- &expected[6].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[7].xmm,
- &expected[7].xmm, sizeof(vals->xmm)));
+ FORKEE_ASSERT_MEMEQ(&vals[0].xmm,
+ &expected[0].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[1].xmm,
+ &expected[1].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[2].xmm,
+ &expected[2].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[3].xmm,
+ &expected[3].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[4].xmm,
+ &expected[4].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[5].xmm,
+ &expected[5].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[6].xmm,
+ &expected[6].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[7].xmm,
+ &expected[7].xmm, sizeof(vals->xmm));
#if defined(__x86_64__)
- FORKEE_ASSERT(!memcmp(&vals[8].xmm,
- &expected[8].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[9].xmm,
- &expected[9].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[10].xmm,
- &expected[10].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[11].xmm,
- &expected[11].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[12].xmm,
- &expected[12].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[13].xmm,
- &expected[13].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[14].xmm,
- &expected[14].xmm, sizeof(vals->xmm)));
- FORKEE_ASSERT(!memcmp(&vals[15].xmm,
- &expected[15].xmm, sizeof(vals->xmm)));
+ FORKEE_ASSERT_MEMEQ(&vals[8].xmm,
+ &expected[8].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[9].xmm,
+ &expected[9].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[10].xmm,
+ &expected[10].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[11].xmm,
+ &expected[11].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[12].xmm,
+ &expected[12].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[13].xmm,
+ &expected[13].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[14].xmm,
+ &expected[14].xmm, sizeof(vals->xmm));
+ FORKEE_ASSERT_MEMEQ(&vals[15].xmm,
+ &expected[15].xmm, sizeof(vals->xmm));
#endif
break;
case FPREGS_YMM:
- FORKEE_ASSERT(!memcmp(&vals[0].ymm,
- &expected[0].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[1].ymm,
- &expected[1].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[2].ymm,
- &expected[2].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[3].ymm,
- &expected[3].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[4].ymm,
- &expected[4].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[5].ymm,
- &expected[5].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[6].ymm,
- &expected[6].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[7].ymm,
- &expected[7].ymm, sizeof(vals->ymm)));
+ FORKEE_ASSERT_MEMEQ(&vals[0].ymm,
+ &expected[0].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[1].ymm,
+ &expected[1].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[2].ymm,
+ &expected[2].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[3].ymm,
+ &expected[3].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[4].ymm,
+ &expected[4].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[5].ymm,
+ &expected[5].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[6].ymm,
+ &expected[6].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[7].ymm,
+ &expected[7].ymm, sizeof(vals->ymm));
#if defined(__x86_64__)
- FORKEE_ASSERT(!memcmp(&vals[8].ymm,
- &expected[8].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[9].ymm,
- &expected[9].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[10].ymm,
- &expected[10].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[11].ymm,
- &expected[11].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[12].ymm,
- &expected[12].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[13].ymm,
- &expected[13].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[14].ymm,
- &expected[14].ymm, sizeof(vals->ymm)));
- FORKEE_ASSERT(!memcmp(&vals[15].ymm,
- &expected[15].ymm, sizeof(vals->ymm)));
+ FORKEE_ASSERT_MEMEQ(&vals[8].ymm,
+ &expected[8].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[9].ymm,
+ &expected[9].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[10].ymm,
+ &expected[10].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[11].ymm,
+ &expected[11].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[12].ymm,
+ &expected[12].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[13].ymm,
+ &expected[13].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[14].ymm,
+ &expected[14].ymm, sizeof(vals->ymm));
+ FORKEE_ASSERT_MEMEQ(&vals[15].ymm,
+ &expected[15].ymm, sizeof(vals->ymm));
#endif
break;
case FPREGS_ZMM:
- FORKEE_ASSERT(!memcmp(&vals[0].zmm,
- &expected[0].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[1].zmm,
- &expected[1].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[2].zmm,
- &expected[2].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[3].zmm,
- &expected[3].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[4].zmm,
- &expected[4].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[5].zmm,
- &expected[5].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[6].zmm,
- &expected[6].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[7].zmm,
- &expected[7].zmm, sizeof(vals->zmm)));
+ FORKEE_ASSERT_MEMEQ(&vals[0].zmm,
+ &expected[0].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[1].zmm,
+ &expected[1].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[2].zmm,
+ &expected[2].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[3].zmm,
+ &expected[3].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[4].zmm,
+ &expected[4].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[5].zmm,
+ &expected[5].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[6].zmm,
+ &expected[6].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[7].zmm,
+ &expected[7].zmm, sizeof(vals->zmm));
#if defined(__x86_64__)
- FORKEE_ASSERT(!memcmp(&vals[8].zmm,
- &expected[8].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[9].zmm,
- &expected[9].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[10].zmm,
- &expected[10].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[11].zmm,
- &expected[11].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[12].zmm,
- &expected[12].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[13].zmm,
- &expected[13].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[14].zmm,
- &expected[14].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[15].zmm,
- &expected[15].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[16].zmm,
- &expected[16].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[17].zmm,
- &expected[17].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[18].zmm,
- &expected[18].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[19].zmm,
- &expected[19].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[20].zmm,
- &expected[20].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[21].zmm,
- &expected[21].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[22].zmm,
- &expected[22].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[23].zmm,
- &expected[23].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[24].zmm,
- &expected[24].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[25].zmm,
- &expected[25].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[26].zmm,
- &expected[26].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[27].zmm,
- &expected[27].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[28].zmm,
- &expected[28].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[29].zmm,
- &expected[29].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[30].zmm,
- &expected[30].zmm, sizeof(vals->zmm)));
- FORKEE_ASSERT(!memcmp(&vals[31].zmm,
- &expected[31].zmm, sizeof(vals->zmm)));
+ FORKEE_ASSERT_MEMEQ(&vals[8].zmm,
+ &expected[8].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[9].zmm,
+ &expected[9].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[10].zmm,
+ &expected[10].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[11].zmm,
+ &expected[11].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[12].zmm,
+ &expected[12].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[13].zmm,
+ &expected[13].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[14].zmm,
+ &expected[14].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[15].zmm,
+ &expected[15].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[16].zmm,
+ &expected[16].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[17].zmm,
+ &expected[17].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[18].zmm,
+ &expected[18].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[19].zmm,
+ &expected[19].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[20].zmm,
+ &expected[20].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[21].zmm,
+ &expected[21].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[22].zmm,
+ &expected[22].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[23].zmm,
+ &expected[23].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[24].zmm,
+ &expected[24].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[25].zmm,
+ &expected[25].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[26].zmm,
+ &expected[26].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[27].zmm,
+ &expected[27].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[28].zmm,
+ &expected[28].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[29].zmm,
+ &expected[29].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[30].zmm,
+ &expected[30].zmm, sizeof(vals->zmm));
+ FORKEE_ASSERT_MEMEQ(&vals[31].zmm,
+ &expected[31].zmm, sizeof(vals->zmm));
#endif
/* k0..k7 */
- FORKEE_ASSERT(vals[32].zmm.a == expected[32].zmm.a);
- FORKEE_ASSERT(vals[32].zmm.b == expected[32].zmm.b);
- FORKEE_ASSERT(vals[32].zmm.c == expected[32].zmm.c);
- FORKEE_ASSERT(vals[32].zmm.d == expected[32].zmm.d);
- FORKEE_ASSERT(vals[32].zmm.e == expected[32].zmm.e);
- FORKEE_ASSERT(vals[32].zmm.f == expected[32].zmm.f);
- FORKEE_ASSERT(vals[32].zmm.g == expected[32].zmm.g);
- FORKEE_ASSERT(vals[32].zmm.h == expected[32].zmm.h);
+ FORKEE_ASSERT_EQ(vals[32].zmm.a,
+ expected[32].zmm.a);
+ FORKEE_ASSERT_EQ(vals[32].zmm.b,
+ expected[32].zmm.b);
+ FORKEE_ASSERT_EQ(vals[32].zmm.c,
+ expected[32].zmm.c);
+ FORKEE_ASSERT_EQ(vals[32].zmm.d,
+ expected[32].zmm.d);
+ FORKEE_ASSERT_EQ(vals[32].zmm.e,
+ expected[32].zmm.e);
+ FORKEE_ASSERT_EQ(vals[32].zmm.f,
+ expected[32].zmm.f);
+ FORKEE_ASSERT_EQ(vals[32].zmm.g,
+ expected[32].zmm.g);
+ FORKEE_ASSERT_EQ(vals[32].zmm.h,
+ expected[32].zmm.h);
break;
}
break;
diff --git a/lib/libc/sys/t_select.c b/lib/libc/sys/t_select.c
index 04a684a8cdea..8559ccd65e73 100644
--- a/lib/libc/sys/t_select.c
+++ b/lib/libc/sys/t_select.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_select.c,v 1.4 2017/01/13 21:18:33 christos Exp $ */
+/* $NetBSD: t_select.c,v 1.5 2024/10/18 16:39:41 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,18 +29,20 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <assert.h>
#include <sys/types.h>
+
#include <sys/select.h>
#include <sys/wait.h>
+
+#include <assert.h>
#include <err.h>
-#include <stdio.h>
-#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
#include <signal.h>
+#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
-#include <errno.h>
-#include <fcntl.h>
#include <atf-c.h>
@@ -207,11 +209,42 @@ ATF_TC_BODY(pselect_timeout, tc)
}
}
+ATF_TC(select_badfd);
+ATF_TC_HEAD(select_badfd, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "Checks select rejects bad fds");
+}
+
+ATF_TC_BODY(select_badfd, tc)
+{
+ int fd;
+
+ for (fd = 0; fd < FD_SETSIZE; fd++) {
+ fd_set readfds;
+ int ret, error;
+
+ if (fcntl(fd, F_GETFL) != -1 || errno != EBADF)
+ continue;
+
+ FD_ZERO(&readfds);
+ FD_SET(fd, &readfds);
+ alarm(5);
+ errno = 0;
+ ret = select(fd + 1, &readfds, NULL, NULL, NULL);
+ error = errno;
+ alarm(0);
+ errno = error;
+ ATF_CHECK_ERRNO(EBADF, ret == -1);
+ }
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, pselect_sigmask);
ATF_TP_ADD_TC(tp, pselect_timeout);
+ ATF_TP_ADD_TC(tp, select_badfd);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_setrlimit.c b/lib/libc/sys/t_setrlimit.c
index 092b19b9fa39..2bcf4812d8d9 100644
--- a/lib/libc/sys/t_setrlimit.c
+++ b/lib/libc/sys/t_setrlimit.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_setrlimit.c,v 1.7 2020/10/13 06:58:57 rin Exp $ */
+/* $NetBSD: t_setrlimit.c,v 1.11 2023/12/07 16:54:44 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_setrlimit.c,v 1.7 2020/10/13 06:58:57 rin Exp $");
+__RCSID("$NetBSD: t_setrlimit.c,v 1.11 2023/12/07 16:54:44 riastradh Exp $");
#include <sys/resource.h>
#include <sys/mman.h>
@@ -48,6 +48,8 @@ __RCSID("$NetBSD: t_setrlimit.c,v 1.7 2020/10/13 06:58:57 rin Exp $");
#include <ucontext.h>
#include <unistd.h>
+#include "h_macros.h"
+
static void sighandler(int);
static const char path[] = "setrlimit";
@@ -524,6 +526,148 @@ ATF_TC_BODY(setrlimit_stack, tc)
}
+ATF_TC(setrlimit_stack_growshrink);
+ATF_TC_HEAD(setrlimit_stack_growshrink, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test that setrlimit(2), RLIMIT_STACK, grows & shrinks the stack");
+}
+
+/*
+ * checkstackchild(n)
+ *
+ * Allocate an array of size n on the stack, and verify it can be
+ * used. If it can't be used, this will crash with SIGSEGV,
+ * deliberately.
+ */
+_Pragma("GCC diagnostic push")
+_Pragma("GCC diagnostic ignored \"-Wstack-protector\"")
+static void
+checkstackchild(size_t n)
+{
+ volatile char *const x = alloca(n);
+ size_t i;
+
+ for (i = 0; i < n; i++)
+ x[i] = 0x1a;
+}
+_Pragma("GCC diagnostic pop")
+
+/*
+ * checkstack(n, expectsegv)
+ *
+ * Check whether we can allocate an array of size n on the stack.
+ *
+ * - If expectsegv, verify that access fails with SIGSEGV.
+ * - If not expectsegv, verify that access succeeds.
+ *
+ * Do this in a subprocess rather than with a SIGSEGV handler,
+ * because once we've allocated an array of size n on the stack,
+ * in the case where the stack is inaccessible, we have just
+ * trashed the stack pointer so badly we can't make function calls
+ * like to a SIGSEGV handler.
+ *
+ * (We could use an alternate signal stack, but I already wrote it
+ * this way, and this is a little simpler and more robust than
+ * juggling signals, setjmp/longjmp, and sigaltstack.)
+ */
+static void
+checkstack(size_t n, int expectsegv)
+{
+ pid_t forked, waited;
+ int status;
+
+ RL(forked = fork());
+ if (forked == 0) { /* child */
+ checkstackchild(n);
+ _exit(expectsegv);
+ }
+
+ /* parent */
+ RL(waited = waitpid(forked, &status, 0));
+ ATF_REQUIRE_EQ_MSG(waited, forked, "waited=%jd forked=%jd",
+ (intmax_t)waited, (intmax_t)forked);
+ if (expectsegv) {
+ ATF_REQUIRE_MSG(!WIFEXITED(status),
+ "expected signal but exited normally with status %d",
+ WEXITSTATUS(status));
+ ATF_REQUIRE_MSG(WIFSIGNALED(status), "status=0x%x", status);
+ ATF_REQUIRE_EQ_MSG(WTERMSIG(status), SIGSEGV, "termsig=%d",
+ WTERMSIG(status));
+ } else {
+ ATF_REQUIRE_MSG(!WIFSIGNALED(status),
+ "expected normal exit but terminated on signal %d",
+ WTERMSIG(status));
+ ATF_REQUIRE_MSG(WIFEXITED(status), "status=0x%x", status);
+ ATF_REQUIRE_EQ_MSG(WEXITSTATUS(status), 0, "exitstatus=%d",
+ WEXITSTATUS(status));
+ }
+}
+
+ATF_TC_BODY(setrlimit_stack_growshrink, tc)
+{
+ struct rlimit res;
+ size_t n;
+
+ /*
+ * Disable core dumps -- we're going to deliberately cause
+ * SIGSEGV to test stack accessibility (which breaks even
+ * calling a function so we can't just use a SIGSEGV handler),
+ * so let's not waste time dumping core.
+ */
+ res = (struct rlimit){ .rlim_cur = 0, .rlim_max = 0 };
+ RL(setrlimit(RLIMIT_CORE, &res));
+
+ /*
+ * Get the current stack size and hard limit.
+ */
+ RL(getrlimit(RLIMIT_STACK, &res));
+ n = res.rlim_cur;
+
+ /*
+ * Verify that we can't get at pages past the end of the stack
+ * right now.
+ */
+ checkstack(n, /*expectsegv*/1);
+
+ /*
+ * Stop if the hard limit is too small to test. Not sure
+ * exactly how much more space we need to verify that setrlimit
+ * actually expands the stack without examining the current
+ * stack pointer relative to the process's stack base, so we'll
+ * just double the stack size -- definitely enough to test
+ * stack growth -- and hope the hard rlimit is big enough to
+ * let us double it.
+ */
+ if (n > res.rlim_max/2)
+ atf_tc_skip("hard stack rlimit is too small");
+
+ /*
+ * Double the stack size. This way we can allocate an array of
+ * length equal to the current stack size and be guaranteed
+ * that (a) it can be allocated, and (b) access to it requires
+ * the stack to have grown.
+ */
+ res.rlim_cur = 2*n;
+ RL(setrlimit(RLIMIT_STACK, &res));
+
+ /*
+ * Verify that we can now get at pages past the end of the new
+ * stack but not beyond that.
+ */
+ checkstack(n, /*expectsegv*/0);
+ if (n < SIZE_MAX/2)
+ checkstack(2*n, /*expectsegv*/1);
+
+ /*
+ * Restore the stack size and verify that we can no longer
+ * access an array of length equal to the whole stack size.
+ */
+ res.rlim_cur = n;
+ RL(setrlimit(RLIMIT_STACK, &res));
+ checkstack(n, /*expectsegv*/1);
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -538,6 +682,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, setrlimit_perm);
ATF_TP_ADD_TC(tp, setrlimit_nthr);
ATF_TP_ADD_TC(tp, setrlimit_stack);
+ ATF_TP_ADD_TC(tp, setrlimit_stack_growshrink);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_sigtimedwait.c b/lib/libc/sys/t_sigtimedwait.c
index 64b68d9a0607..36304b6c2d11 100644
--- a/lib/libc/sys/t_sigtimedwait.c
+++ b/lib/libc/sys/t_sigtimedwait.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sigtimedwait.c,v 1.2 2013/03/08 23:18:00 martin Exp $ */
+/* $NetBSD: t_sigtimedwait.c,v 1.5 2025/12/19 04:41:02 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -27,15 +27,26 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_sigtimedwait.c,v 1.2 2013/03/08 23:18:00 martin Exp $");
+__RCSID("$NetBSD: t_sigtimedwait.c,v 1.5 2025/12/19 04:41:02 riastradh Exp $");
#include <sys/time.h>
+
+#include <atf-c.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
-#include <atf-c.h>
+#include <unistd.h>
+
+#include "h_macros.h"
+static void
+on_alarm(int signo)
+{
+ const char msg[] = "SIGALRM delivered\n";
+
+ (void)write(STDERR_FILENO, msg, strlen(msg));
+}
ATF_TC(sigtimedwait_all0timeout);
@@ -51,16 +62,20 @@ ATF_TC_BODY(sigtimedwait_all0timeout, tc)
sigset_t block;
struct timespec ts, before, after, len;
siginfo_t info;
- int r;
+ int signo, error;
- sigemptyset(&block);
+ RL(sigemptyset(&block));
ts.tv_sec = 0;
ts.tv_nsec = 0;
- clock_gettime(CLOCK_MONOTONIC, &before);
- r = sigtimedwait(&block, &info, &ts);
- clock_gettime(CLOCK_MONOTONIC, &after);
- ATF_REQUIRE(r == -1);
- ATF_REQUIRE_ERRNO(EAGAIN, errno);
+ RL(clock_gettime(CLOCK_MONOTONIC, &before));
+ signo = sigtimedwait(&block, &info, &ts);
+ error = errno;
+ RL(clock_gettime(CLOCK_MONOTONIC, &after));
+ ATF_REQUIRE_MSG(signo == -1, "signo=%d, expected -1/EAGAIN=%d",
+ signo, EAGAIN);
+ errno = error;
+ ATF_REQUIRE_MSG(errno == EAGAIN, "errno=%d (%s), expected EAGAIN=%d",
+ error, strerror(error), EAGAIN);
timespecsub(&after, &before, &len);
ATF_REQUIRE(len.tv_sec < 1);
}
@@ -78,18 +93,19 @@ ATF_TC_BODY(sigtimedwait_NULL_timeout, tc)
sigset_t sig;
siginfo_t info;
struct itimerval it;
- int r;
+ int signo;
/* arrange for a SIGALRM signal in a few seconds */
memset(&it, 0, sizeof it);
it.it_value.tv_sec = 5;
- ATF_REQUIRE(setitimer(ITIMER_REAL, &it, NULL) == 0);
+ RL(setitimer(ITIMER_REAL, &it, NULL));
/* wait without timeout */
- sigemptyset(&sig);
- sigaddset(&sig, SIGALRM);
- r = sigtimedwait(&sig, &info, NULL);
- ATF_REQUIRE(r == SIGALRM);
+ RL(sigemptyset(&sig));
+ RL(sigaddset(&sig, SIGALRM));
+ RL(signo = sigtimedwait(&sig, &info, NULL));
+ ATF_REQUIRE_MSG(signo == SIGALRM, "signo=%d, expected SIGALRM=%d",
+ signo, SIGALRM);
}
ATF_TC(sigtimedwait_small_timeout);
@@ -106,14 +122,114 @@ ATF_TC_BODY(sigtimedwait_small_timeout, tc)
sigset_t block;
struct timespec ts;
siginfo_t info;
- int r;
+ int signo, error;
+
+ RL(sigemptyset(&block));
+ ts.tv_sec = 5;
+ ts.tv_nsec = 0;
+ signo = sigtimedwait(&block, &info, &ts);
+ ATF_REQUIRE_MSG(signo == -1, "signo=%d, expected -1/EAGAIN=%d",
+ signo, EAGAIN);
+ error = errno;
+ ATF_REQUIRE_MSG(errno == EAGAIN, "errno=%d (%s), expected EAGAIN=%d",
+ error, strerror(error), EAGAIN);
+}
+
+ATF_TC(sigtimedwait_small_timeout_alarm);
+
+ATF_TC_HEAD(sigtimedwait_small_timeout_alarm, tc)
+{
+ atf_tc_set_md_var(tc, "timeout", "15");
+ atf_tc_set_md_var(tc, "descr", "Test sigtimedwait with a small "
+ "timeout");
+}
+
+ATF_TC_BODY(sigtimedwait_small_timeout_alarm, tc)
+{
+ sigset_t block;
+ struct sigaction sa = {.sa_handler = &on_alarm}; /* no SA_RESTART */
+ struct timespec ts;
+ siginfo_t info;
+ int signo;
- sigemptyset(&block);
+ RL(sigaction(SIGALRM, &sa, NULL));
+
+ RL(sigemptyset(&block));
ts.tv_sec = 5;
ts.tv_nsec = 0;
- r = sigtimedwait(&block, &info, &ts);
- ATF_REQUIRE(r == -1);
- ATF_REQUIRE_ERRNO(EAGAIN, errno);
+ RL(sigaddset(&block, SIGALRM));
+ RL(sigprocmask(SIG_BLOCK, &block, NULL));
+ REQUIRE_LIBC(alarm(1), (unsigned)-1);
+ RL(signo = sigtimedwait(&block, &info, &ts));
+ ATF_REQUIRE_MSG(signo == SIGALRM, "signo=%d, expected SIGALRM=%d",
+ signo, SIGALRM);
+}
+
+ATF_TC(sigtimedwait_small_timeout_other_sig);
+
+ATF_TC_HEAD(sigtimedwait_small_timeout_other_sig, tc)
+{
+ atf_tc_set_md_var(tc, "timeout", "15");
+ atf_tc_set_md_var(tc, "descr", "Test sigtimedwait interruption "
+ "by a signal it's not waiting for");
+}
+
+ATF_TC_BODY(sigtimedwait_small_timeout_other_sig, tc)
+{
+ sigset_t sig;
+ struct sigaction sa = {.sa_handler = &on_alarm}; /* no SA_RESTART */
+ struct timespec ts;
+ siginfo_t info;
+ int signo, error;
+
+ RL(sigaction(SIGALRM, &sa, NULL));
+
+ RL(sigemptyset(&sig));
+ ts.tv_sec = 5;
+ ts.tv_nsec = 0;
+ RL(sigaddset(&sig, SIGUSR1));
+ RL(sigprocmask(SIG_BLOCK, &sig, NULL));
+ REQUIRE_LIBC(alarm(1), (unsigned)-1);
+ /*
+ * This returns 0 sometimes, when it should return -1/EINTR
+ * because some signal unblocked was delivered.
+ */
+ signo = sigtimedwait(&sig, &info, &ts);
+ ATF_REQUIRE_MSG(signo == -1, "signo=%d, expected -1/EINTR=%d",
+ signo, EINTR);
+ error = errno;
+ ATF_REQUIRE_MSG(errno == EINTR, "errno=%d (%s), expected EINTR=%d",
+ error, strerror(error), EINTR);
+}
+
+ATF_TC(sigwaitinfo_other_sig);
+
+ATF_TC_HEAD(sigwaitinfo_other_sig, tc)
+{
+ atf_tc_set_md_var(tc, "timeout", "15");
+ atf_tc_set_md_var(tc, "descr", "Test sigwaitinfo interruption "
+ "by a signal it's not waiting for");
+}
+
+ATF_TC_BODY(sigwaitinfo_other_sig, tc)
+{
+ sigset_t sig;
+ struct sigaction sa = {.sa_handler = &on_alarm}; /* no SA_RESTART */
+ siginfo_t info;
+ int signo, error;
+
+ RL(sigaction(SIGALRM, &sa, NULL));
+
+ RL(sigemptyset(&sig));
+ RL(sigaddset(&sig, SIGUSR1));
+ RL(sigprocmask(SIG_BLOCK, &sig, NULL));
+ REQUIRE_LIBC(alarm(1), (unsigned)-1);
+ signo = sigwaitinfo(&sig, &info);
+ ATF_REQUIRE_MSG(signo == -1, "signo=%d, expected -1/EINTR=%d",
+ signo, EINTR);
+ error = errno;
+ ATF_REQUIRE_MSG(errno == EINTR, "errno=%d (%s), expected EINTR=%d",
+ error, strerror(error), EINTR);
}
ATF_TP_ADD_TCS(tp)
@@ -121,6 +237,9 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, sigtimedwait_all0timeout);
ATF_TP_ADD_TC(tp, sigtimedwait_NULL_timeout);
ATF_TP_ADD_TC(tp, sigtimedwait_small_timeout);
+ ATF_TP_ADD_TC(tp, sigtimedwait_small_timeout_alarm);
+ ATF_TP_ADD_TC(tp, sigtimedwait_small_timeout_other_sig);
+ ATF_TP_ADD_TC(tp, sigwaitinfo_other_sig);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_socketpair.c b/lib/libc/sys/t_socketpair.c
index 266d738ccb0f..28246712ccdc 100644
--- a/lib/libc/sys/t_socketpair.c
+++ b/lib/libc/sys/t_socketpair.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_socketpair.c,v 1.2 2017/01/13 20:04:52 christos Exp $ */
+/* $NetBSD: t_socketpair.c,v 1.3 2025/07/17 19:50:40 kre Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_socketpair.c,v 1.2 2017/01/13 20:04:52 christos Exp $");
+__RCSID("$NetBSD: t_socketpair.c,v 1.3 2025/07/17 19:50:40 kre Exp $");
#include <atf-c.h>
#include <fcntl.h>
@@ -46,6 +46,13 @@ __RCSID("$NetBSD: t_socketpair.c,v 1.2 2017/01/13 20:04:52 christos Exp $");
#include <sys/un.h>
#include <errno.h>
+#ifndef SOCK_CLOFORK
+#define SOCK_CLOFORK 0
+#endif
+#ifndef FD_CLOFORK
+#define FD_CLOFORK 0
+#endif
+
static void
connected(int fd)
{
@@ -81,6 +88,14 @@ run(int flags)
ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOEXEC) == 0);
}
+ if (flags & SOCK_CLOFORK) {
+ ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOFORK) != 0);
+ ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOFORK) != 0);
+ } else {
+ ATF_REQUIRE((fcntl(fd[0], F_GETFD) & FD_CLOFORK) == 0);
+ ATF_REQUIRE((fcntl(fd[1], F_GETFD) & FD_CLOFORK) == 0);
+ }
+
if (flags & SOCK_NONBLOCK) {
ATF_REQUIRE((fcntl(fd[0], F_GETFL) & O_NONBLOCK) != 0);
ATF_REQUIRE((fcntl(fd[1], F_GETFL) & O_NONBLOCK) != 0);
@@ -126,12 +141,28 @@ ATF_TC_BODY(socketpair_cloexec, tc)
run(SOCK_CLOEXEC);
}
+ATF_TC(socketpair_clofork);
+ATF_TC_HEAD(socketpair_clofork, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "A close-on-fork of socketpair(2)");
+}
+
+ATF_TC_BODY(socketpair_clofork, tc)
+{
+#if defined(SOCK_CLOFORK) && SOCK_CLOFORK != 0
+ run(SOCK_CLOFORK);
+#else
+ atf_tc_skip("SOCK_CLOFORK not defined");
+#endif
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, socketpair_basic);
ATF_TP_ADD_TC(tp, socketpair_nonblock);
ATF_TP_ADD_TC(tp, socketpair_cloexec);
+ ATF_TP_ADD_TC(tp, socketpair_clofork);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_swapcontext.c b/lib/libc/sys/t_swapcontext.c
index 82090f785761..75c310fdca3a 100644
--- a/lib/libc/sys/t_swapcontext.c
+++ b/lib/libc/sys/t_swapcontext.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_swapcontext.c,v 1.4 2023/08/01 20:09:12 andvar Exp $ */
+/* $NetBSD: t_swapcontext.c,v 1.5 2024/05/27 22:03:21 thorpej Exp $ */
/*
* Copyright (c) 2012 Emmanuel Dreyfus. All rights reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_swapcontext.c,v 1.4 2023/08/01 20:09:12 andvar Exp $");
+__RCSID("$NetBSD: t_swapcontext.c,v 1.5 2024/05/27 22:03:21 thorpej Exp $");
#include <ucontext.h>
#include <stdio.h>
@@ -81,13 +81,9 @@ mainfunc(void)
nctx.uc_stack.ss_sp = stack;
nctx.uc_stack.ss_size = sizeof(stack);
-#ifndef _UC_TLSBASE
- ATF_REQUIRE_MSG(0, "_UC_TLSBASE is not defined");
-#else /* _UC_TLSBASE */
ATF_REQUIRE(nctx.uc_flags & _UC_TLSBASE);
if (!alter_tlsbase)
nctx.uc_flags &= ~_UC_TLSBASE;
-#endif /* _UC_TLSBASE */
makecontext(&nctx, swapfunc, 0);
@@ -108,6 +104,9 @@ ATF_TC_HEAD(swapcontext1, tc)
}
ATF_TC_BODY(swapcontext1, tc)
{
+#ifdef __vax__
+ atf_tc_expect_fail("PR port-vax/58290");
+#endif
alter_tlsbase = 0;
mainfunc();
}
@@ -120,6 +119,9 @@ ATF_TC_HEAD(swapcontext2, tc)
}
ATF_TC_BODY(swapcontext2, tc)
{
+#ifdef __vax__
+ atf_tc_expect_fail("PR port-vax/58290");
+#endif
alter_tlsbase = 1;
mainfunc();
}
diff --git a/lib/libc/sys/t_timer_create.c b/lib/libc/sys/t_timer_create.c
index e8a6acd08efc..403413b6a808 100644
--- a/lib/libc/sys/t_timer_create.c
+++ b/lib/libc/sys/t_timer_create.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_timer_create.c,v 1.5 2017/01/16 16:32:13 christos Exp $ */
+/* $NetBSD: t_timer_create.c,v 1.11 2026/02/07 01:47:23 riastradh Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -34,32 +34,45 @@
#include <time.h>
#include <unistd.h>
+#include "h_macros.h"
+
+#define TIME_MAX __type_max(time_t)
+
static timer_t t;
-static bool fail = true;
+static sig_atomic_t expired;
+
+enum mode {
+ PAST,
+ EXPIRE,
+ NOEXPIRE,
+};
static void
timer_signal_handler(int signo, siginfo_t *si, void *osi __unused)
{
+ const int errno_save = errno;
timer_t *tp;
tp = si->si_value.sival_ptr;
if (*tp == t && signo == SIGALRM)
- fail = false;
+ expired = 1;
(void)fprintf(stderr, "%s: %s\n", __func__, strsignal(signo));
+ errno = errno_save;
}
static void
-timer_signal_create(clockid_t cid, bool expire)
+timer_signal_create(clockid_t cid, enum mode mode, int flags)
{
- struct itimerspec tim;
+ struct itimerspec tim, rtim, otim;
+ struct timespec t0, t1, dt;
struct sigaction act;
struct sigevent evt;
sigset_t set;
t = 0;
- fail = true;
+ expired = 0;
(void)memset(&evt, 0, sizeof(struct sigevent));
(void)memset(&act, 0, sizeof(struct sigaction));
@@ -91,22 +104,143 @@ timer_signal_create(clockid_t cid, bool expire)
ATF_REQUIRE(timer_create(cid, &evt, &t) == 0);
/*
- * Start the timer. After this, unblock the signal.
+ * Configure the timer for -1, 1, or 5 sec from now, depending
+ * on whether we want it to have fired, to fire within 2sec, or
+ * to not fire within 2sec.
*/
- tim.it_value.tv_sec = expire ? 5 : 1;
+ switch (mode) {
+ case PAST:
+ ATF_REQUIRE(flags & TIMER_ABSTIME);
+ tim.it_value.tv_sec = -1;
+ break;
+ case EXPIRE:
+ tim.it_value.tv_sec = 1;
+ break;
+ case NOEXPIRE:
+ tim.it_value.tv_sec = 5;
+ break;
+ }
tim.it_value.tv_nsec = 0;
- ATF_REQUIRE(timer_settime(t, 0, &tim, NULL) == 0);
+ /*
+ * Save the relative time and adjust for absolute time of
+ * requested.
+ */
+ rtim = tim;
+ RL(clock_gettime(cid, &t0));
+ if (flags & TIMER_ABSTIME)
+ timespecadd(&t0, &tim.it_value, &tim.it_value);
+
+ fprintf(stderr, "now is %lld sec %d nsec\n",
+ (long long)t0.tv_sec, (int)t0.tv_nsec);
+ fprintf(stderr, "expire at %lld sec %d nsec\n",
+ (long long)tim.it_value.tv_sec, (int)tim.it_value.tv_nsec);
+ RL(timer_settime(t, flags, &tim, NULL));
+ RL(timer_settime(t, flags, &tim, &otim));
- (void)sigprocmask(SIG_UNBLOCK, &set, NULL);
- (void)sleep(2);
+ RL(clock_gettime(cid, &t1));
+ timespecsub(&t1, &t0, &dt);
+ fprintf(stderr, "%lld sec %d nsec elapsed\n",
+ (long long)dt.tv_sec, (int)dt.tv_nsec);
- if (expire) {
- if (!fail)
- atf_tc_fail("timer fired too soon");
- } else {
- if (fail)
- atf_tc_fail("timer failed to fire");
+ /*
+ * Check to make sure the time remaining is at most the
+ * relative time we expected -- plus slop of up to 2sec,
+ * because timer_settime rounds the duration up to a multiple
+ * of a tick period, which is at most 1sec (usually more like
+ * 10ms or 1ms, and in the future with high-resolution timers
+ * it'll be more like clock_getres(cid), but we don't have a
+ * way to get this bound right now), and if we ask for a wakeup
+ * (say) 0.9tick at a time 0.8tick before the next tick, the
+ * next tick is too early so we have to wait two ticks.
+ *
+ * The main point of this is to make sure that we're not
+ * getting absolute time by mistake (PR 58917) so the slop of
+ * 2sec is fine.
+ *
+ * Parentheses are required around the argument
+ *
+ * &(const struct timespec){2, 0}
+ *
+ * to timespecadd because it's a macro and the brilliant C
+ * preprocessor splits arguments at a comma if they're not
+ * parenthesized.
+ */
+ if (flags & TIMER_ABSTIME) {
+ timespecadd(&rtim.it_value, (&(const struct timespec){2, 0}),
+ &rtim.it_value);
+ }
+ ATF_CHECK_MSG(timespeccmp(&otim.it_value, &rtim.it_value, <=),
+ "time remaining %lld sec %d nsec,"
+ " expected at most %lld sec %d nsec",
+ (long long)otim.it_value.tv_sec, (int)otim.it_value.tv_nsec,
+ (long long)rtim.it_value.tv_sec, (int)rtim.it_value.tv_nsec);
+
+#if 0
+ /*
+ * Check to make sure that the amount the time remaining has
+ * gone down is at most the time elapsed.
+ *
+ * XXX Currently the time returned by timer_settime is only
+ * good to the nearest kernel tick (typically 10ms or 1ms), not
+ * to the resolution of the underlying clock -- unlike
+ * clock_gettime. So we can't set this bound. Not sure
+ * whether this is a bug or not, hence #if 0 instead of
+ * atf_tc_expect_fail.
+ */
+ timespecsub(&t1, &t0, &dt);
+ timespecsub(&rtim.it_value, &otim.it_value, &rtim.it_value);
+ ATF_CHECK_MSG(timespeccmp(&rtim.it_value, &dt, <=),
+ "time remaining went down by %lld sec %d nsec,"
+ " expected at most %lld sec %d nsec",
+ (long long)rtim.it_value.tv_sec, (int)rtim.it_value.tv_nsec,
+ (long long)dt.tv_sec, (int)dt.tv_nsec);
+#endif
+
+ /*
+ * Check to make sure the reload interval is what we set.
+ */
+ ATF_CHECK_MSG(timespeccmp(&otim.it_interval, &rtim.it_interval, ==),
+ "interval %lld sec %d nsec,"
+ " expected %lld sec %d nsec",
+ (long long)otim.it_interval.tv_sec, (int)otim.it_interval.tv_nsec,
+ (long long)rtim.it_interval.tv_sec, (int)rtim.it_interval.tv_nsec);
+
+ (void)sigprocmask(SIG_UNBLOCK, &set, NULL);
+ switch (mode) {
+ case PAST:
+ /*
+ * Wait for at least one tick to pass.
+ *
+ * XXX This does not really follow POSIX, which says
+ * `If the specified time has already passed, the
+ * function shall succeed and the expiration
+ * notification shall be made.'
+ * (https://pubs.opengroup.org/onlinepubs/9799919799.2024edition/functions/timer_settime.html),
+ * suggesting that it should be immediate without any
+ * further delay, but other operating systems also
+ * sometimes have a small delay.
+ */
+ RL(clock_nanosleep(cid, 0, &(const struct timespec){0, 1},
+ NULL));
+ ATF_CHECK_MSG(expired, "timer failed to fire immediately");
+ break;
+ case EXPIRE:
+ case NOEXPIRE:
+ ATF_CHECK_MSG(!expired, "timer fired too soon");
+ (void)sleep(2);
+ switch (mode) {
+ case PAST:
+ __unreachable();
+ case EXPIRE:
+ ATF_CHECK_MSG(expired,
+ "timer failed to fire immediately");
+ break;
+ case NOEXPIRE:
+ ATF_CHECK_MSG(!expired, "timer fired too soon");
+ break;
+ }
+ break;
}
ATF_REQUIRE(timer_delete(t) == 0);
@@ -116,7 +250,7 @@ ATF_TC(timer_create_err);
ATF_TC_HEAD(timer_create_err, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Check errors from timer_create(2) (PR lib/42434");
+ "Check errors from timer_create(2) (PR lib/42434)");
}
ATF_TC_BODY(timer_create_err, tc)
@@ -149,7 +283,21 @@ ATF_TC_HEAD(timer_create_real, tc)
ATF_TC_BODY(timer_create_real, tc)
{
- timer_signal_create(CLOCK_REALTIME, false);
+ timer_signal_create(CLOCK_REALTIME, NOEXPIRE, 0);
+}
+
+ATF_TC(timer_create_real_abs);
+ATF_TC_HEAD(timer_create_real_abs, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timer_create(2) with CLOCK_REALTIME and sigevent(3), "
+ "SIGEV_SIGNAL, using absolute time");
+}
+
+ATF_TC_BODY(timer_create_real_abs, tc)
+{
+ timer_signal_create(CLOCK_REALTIME, NOEXPIRE, TIMER_ABSTIME);
}
ATF_TC(timer_create_mono);
@@ -163,7 +311,21 @@ ATF_TC_HEAD(timer_create_mono, tc)
ATF_TC_BODY(timer_create_mono, tc)
{
- timer_signal_create(CLOCK_MONOTONIC, false);
+ timer_signal_create(CLOCK_MONOTONIC, NOEXPIRE, 0);
+}
+
+ATF_TC(timer_create_mono_abs);
+ATF_TC_HEAD(timer_create_mono_abs, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timer_create(2) with CLOCK_MONOTONIC and sigevent(3), "
+ "SIGEV_SIGNAL, using absolute time");
+}
+
+ATF_TC_BODY(timer_create_mono_abs, tc)
+{
+ timer_signal_create(CLOCK_MONOTONIC, NOEXPIRE, TIMER_ABSTIME);
}
ATF_TC(timer_create_real_expire);
@@ -177,7 +339,21 @@ ATF_TC_HEAD(timer_create_real_expire, tc)
ATF_TC_BODY(timer_create_real_expire, tc)
{
- timer_signal_create(CLOCK_REALTIME, true);
+ timer_signal_create(CLOCK_REALTIME, EXPIRE, 0);
+}
+
+ATF_TC(timer_create_real_expire_abs);
+ATF_TC_HEAD(timer_create_real_expire_abs, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timer_create(2) with CLOCK_REALTIME and sigevent(3), "
+ "SIGEV_SIGNAL, with expiration, using absolute time");
+}
+
+ATF_TC_BODY(timer_create_real_expire_abs, tc)
+{
+ timer_signal_create(CLOCK_REALTIME, EXPIRE, TIMER_ABSTIME);
}
ATF_TC(timer_create_mono_expire);
@@ -191,7 +367,111 @@ ATF_TC_HEAD(timer_create_mono_expire, tc)
ATF_TC_BODY(timer_create_mono_expire, tc)
{
- timer_signal_create(CLOCK_MONOTONIC, true);
+ timer_signal_create(CLOCK_MONOTONIC, EXPIRE, 0);
+}
+
+ATF_TC(timer_create_mono_expire_abs);
+ATF_TC_HEAD(timer_create_mono_expire_abs, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timer_create(2) with CLOCK_MONOTONIC and sigevent(3), "
+ "SIGEV_SIGNAL, with expiration, using absolute time");
+}
+
+ATF_TC_BODY(timer_create_mono_expire_abs, tc)
+{
+ timer_signal_create(CLOCK_MONOTONIC, EXPIRE, TIMER_ABSTIME);
+}
+
+ATF_TC(timer_create_real_past_abs);
+ATF_TC_HEAD(timer_create_real_past_abs, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timer_create(2) with CLOCK_REALTIME and sigevent(3), "
+ "SIGEV_SIGNAL, with expiration passed before timer_settime(2),"
+ " using absolute time");
+}
+
+ATF_TC_BODY(timer_create_real_past_abs, tc)
+{
+ timer_signal_create(CLOCK_REALTIME, PAST, TIMER_ABSTIME);
+}
+
+ATF_TC(timer_create_mono_past_abs);
+ATF_TC_HEAD(timer_create_mono_past_abs, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Checks timer_create(2) with CLOCK_MONOTONIC and sigevent(3), "
+ "SIGEV_SIGNAL, with expiration passed before timer_settime(2),"
+ " using absolute time");
+}
+
+ATF_TC_BODY(timer_create_mono_past_abs, tc)
+{
+ timer_signal_create(CLOCK_MONOTONIC, PAST, TIMER_ABSTIME);
+}
+
+ATF_TC(timer_invalidtime);
+ATF_TC_HEAD(timer_invalidtime, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify timer_settime(2) rejects invalid times");
+}
+
+ATF_TC_BODY(timer_invalidtime, tc)
+{
+ const struct itimerspec einval_its[] = {
+ [0] = { .it_value = {-1, 0} },
+ [1] = { .it_value = {0, -1} },
+ [2] = { .it_value = {0, 1000000001} },
+ [3] = { .it_value = {1, 0}, .it_interval = {-1, 0} },
+ [4] = { .it_value = {1, 0}, .it_interval = {0, -1} },
+ [5] = { .it_value = {1, 0}, .it_interval = {0, 1000000001} },
+ [6] = { .it_value = {TIME_MAX - 1, 0}, .it_interval = {0, 0} },
+ [7] = { .it_value = {TIME_MAX, 0}, .it_interval = {0, 0} },
+ };
+ struct timespec now;
+ sigset_t sigs, mask;
+ unsigned i;
+
+ RL(sigemptyset(&sigs));
+ RL(sigaddset(&sigs, SIGALRM));
+ RL(sigprocmask(SIG_BLOCK, &sigs, &mask));
+
+ RL(clock_gettime(CLOCK_MONOTONIC, &now));
+
+ RL(timer_create(CLOCK_MONOTONIC, NULL, &t));
+
+ for (i = 0; i < __arraycount(einval_its); i++) {
+ struct itimerspec its;
+
+ fprintf(stderr, "case %u\n", i);
+
+ ATF_CHECK_ERRNO(EINVAL,
+ timer_settime(t, 0, &einval_its[i], NULL) == -1);
+
+ /*
+ * Try the same with an absolute time near now (unless
+ * that makes it a valid time, in case 0).
+ */
+ if (i == 0)
+ continue;
+ its.it_value = einval_its[i].it_value;
+ its.it_value.tv_sec += now.tv_sec;
+ its.it_interval = einval_its[i].it_interval;
+ ATF_CHECK_ERRNO(EINVAL,
+ timer_settime(t, TIMER_ABSTIME, &its, NULL) == -1);
+ }
+
+ /* Wait up to 2sec to make sure no timer got set anyway. */
+ ATF_CHECK_ERRNO(EAGAIN,
+ sigtimedwait(&sigs, NULL, &(const struct timespec){2, 0}) == -1);
+ RL(sigprocmask(SIG_SETMASK, &mask, NULL));
+
+ RL(timer_delete(t));
}
ATF_TP_ADD_TCS(tp)
@@ -199,9 +479,16 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, timer_create_err);
ATF_TP_ADD_TC(tp, timer_create_real);
+ ATF_TP_ADD_TC(tp, timer_create_real_abs);
ATF_TP_ADD_TC(tp, timer_create_mono);
+ ATF_TP_ADD_TC(tp, timer_create_mono_abs);
ATF_TP_ADD_TC(tp, timer_create_real_expire);
+ ATF_TP_ADD_TC(tp, timer_create_real_expire_abs);
ATF_TP_ADD_TC(tp, timer_create_mono_expire);
+ ATF_TP_ADD_TC(tp, timer_create_mono_expire_abs);
+ ATF_TP_ADD_TC(tp, timer_create_real_past_abs);
+ ATF_TP_ADD_TC(tp, timer_create_mono_past_abs);
+ ATF_TP_ADD_TC(tp, timer_invalidtime);
return atf_no_error();
}
diff --git a/lib/libc/sys/t_timerfd.c b/lib/libc/sys/t_timerfd.c
index e3a4652e39a0..2e57ceba5813 100644
--- a/lib/libc/sys/t_timerfd.c
+++ b/lib/libc/sys/t_timerfd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_timerfd.c,v 1.5 2023/07/08 15:32:58 riastradh Exp $ */
+/* $NetBSD: t_timerfd.c,v 1.12 2025/04/16 01:32:48 riastradh Exp $ */
/*-
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -29,25 +29,28 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2020\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_timerfd.c,v 1.5 2023/07/08 15:32:58 riastradh Exp $");
+__RCSID("$NetBSD: t_timerfd.c,v 1.12 2025/04/16 01:32:48 riastradh Exp $");
#include <sys/types.h>
+
#include <sys/event.h>
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/timerfd.h>
+
#include <errno.h>
#include <poll.h>
#include <pthread.h>
-#include <stdlib.h>
#include <stdio.h>
+#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <atf-c.h>
+#include "h_macros.h"
#include "isqemu.h"
struct helper_context {
@@ -145,6 +148,24 @@ ATF_TC_BODY(timerfd_create, tc)
/*****************************************************************************/
+ATF_TC(timerfd_write);
+ATF_TC_HEAD(timerfd_write, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "validates rejection of writes to timerfds");
+}
+ATF_TC_BODY(timerfd_write, tc)
+{
+ int fd;
+ char c = 1;
+
+ RL(fd = timerfd_create(CLOCK_REALTIME, 0));
+ ATF_CHECK_ERRNO(EBADF, write(fd, &c, 1) == -1);
+ RL(close(fd));
+}
+
+/*****************************************************************************/
+
ATF_TC(timerfd_bogusfd);
ATF_TC_HEAD(timerfd_bogusfd, tc)
{
@@ -170,6 +191,106 @@ ATF_TC_BODY(timerfd_bogusfd, tc)
/*****************************************************************************/
+ATF_TC(timerfd_invalidtime);
+ATF_TC_HEAD(timerfd_invalidtime, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "validates rejection of invalid itimerspec by timerfd_settime()");
+}
+ATF_TC_BODY(timerfd_invalidtime, tc)
+{
+ const struct itimerspec einval_its[] = {
+ [0] = { .it_value = {-1, 0} },
+ [1] = { .it_value = {0, -1} },
+ [2] = { .it_value = {0, 1000000001} },
+ [3] = { .it_value = {1, 0}, .it_interval = {-1, 0} },
+ [4] = { .it_value = {1, 0}, .it_interval = {0, -1} },
+ [5] = { .it_value = {1, 0}, .it_interval = {0, 1000000001} },
+ };
+ struct timespec now;
+ unsigned i;
+ fd_set readfds;
+ uint64_t val;
+ int fd;
+
+ RL(clock_gettime(CLOCK_MONOTONIC, &now));
+ RL(fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK));
+
+ for (i = 0; i < __arraycount(einval_its); i++) {
+ struct itimerspec its;
+
+ fprintf(stderr, "case %u\n", i);
+
+ ATF_CHECK_ERRNO(EINVAL,
+ timerfd_settime(fd, 0, &einval_its[i], NULL) == -1);
+
+ /*
+ * Try the same with an absolute time near now (unless
+ * that makes it a valid time, in case 0).
+ */
+ if (i == 0)
+ continue;
+ its.it_value = einval_its[i].it_value;
+ its.it_value.tv_sec += now.tv_sec;
+ its.it_interval = einval_its[i].it_interval;
+ ATF_CHECK_ERRNO(EINVAL,
+ timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, NULL) == -1);
+ }
+
+ /* Wait up to 2sec to make sure no timer got set anyway. */
+ FD_ZERO(&readfds);
+ FD_SET(fd, &readfds);
+ RL(select(fd + 1, &readfds, NULL, NULL, &(struct timeval){2, 0}));
+ ATF_CHECK(!FD_ISSET(fd, &readfds));
+ ATF_CHECK_ERRNO(EAGAIN, timerfd_read(fd, &val) == -1);
+
+ RL(close(fd));
+}
+
+/*****************************************************************************/
+
+ATF_TC(timerfd_past);
+ATF_TC_HEAD(timerfd_past, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "validates trigger on past time");
+}
+ATF_TC_BODY(timerfd_past, tc)
+{
+ struct itimerspec its = {.it_value = {-1, 0}, .it_interval = {0, 0}};
+ struct timespec then, now, delta;
+ uint64_t val;
+ int fd;
+
+ RL(fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK));
+
+ RL(clock_gettime(CLOCK_MONOTONIC, &then));
+ timespecadd(&then, &its.it_value, &its.it_value);
+ RL(timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, NULL));
+
+ /*
+ * Wait for one tick to pass.
+ *
+ * XXX Having to do this seems silly, but it matches Linux, so.
+ */
+ RL(clock_nanosleep(CLOCK_MONOTONIC, 0, &(const struct timespec){0, 1},
+ NULL));
+
+ RL(timerfd_read(fd, &val));
+ RL(clock_gettime(CLOCK_MONOTONIC, &now));
+ ATF_REQUIRE(check_value_against_bounds(val, 1, 1));
+
+ timespecsub(&now, &then, &delta);
+ ATF_CHECK_MSG(check_value_against_bounds(delta.tv_sec, 0, 0),
+ "then=%jd.%09lu now=%jd.%09lu delta=%jd.%09lu",
+ (intmax_t)then.tv_sec, then.tv_nsec,
+ (intmax_t)now.tv_sec, now.tv_nsec,
+ (intmax_t)delta.tv_sec, delta.tv_nsec);
+
+ RL(close(fd));
+}
+
+/*****************************************************************************/
+
ATF_TC(timerfd_block);
ATF_TC_HEAD(timerfd_block, tc)
{
@@ -183,6 +304,7 @@ ATF_TC_BODY(timerfd_block, tc)
ATF_REQUIRE((fd = timerfd_create(CLOCK_MONOTONIC, 0)) >= 0);
+ struct itimerspec oits;
const struct itimerspec its = {
.it_value = { .tv_sec = 1, .tv_nsec = 0 },
.it_interval = { .tv_sec = 0, .tv_nsec = 0 },
@@ -190,6 +312,12 @@ ATF_TC_BODY(timerfd_block, tc)
ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &then) == 0);
ATF_REQUIRE(timerfd_settime(fd, 0, &its, NULL) == 0);
+ ATF_REQUIRE(timerfd_settime(fd, 0, &its, &oits) == 0);
+ ATF_CHECK_MSG(timespeccmp(&oits.it_value, &its.it_value, <=),
+ "timerfd_settime returned %jd.%09lu remaining,"
+ " expected at most %jd.%09lu",
+ (intmax_t)oits.it_value.tv_sec, oits.it_value.tv_nsec,
+ (intmax_t)its.it_value.tv_sec, its.it_value.tv_nsec);
ATF_REQUIRE(timerfd_read(fd, &val) == 0);
ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &now) == 0);
ATF_REQUIRE(check_value_against_bounds(val, 1, 1));
@@ -258,15 +386,23 @@ ATF_TC_BODY(timerfd_abstime, tc)
ATF_REQUIRE((fd = timerfd_create(CLOCK_MONOTONIC, 0)) >= 0);
- struct itimerspec its = {
+ struct itimerspec oits, its = {
.it_value = { .tv_sec = 0, .tv_nsec = 0 },
.it_interval = { .tv_sec = 0, .tv_nsec = 0 },
};
ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &then) == 0);
- its.it_value = then;
- its.it_value.tv_sec += 1;
+ delta = (struct timespec){1, 0};
+ timespecadd(&then, &delta, &its.it_value);
ATF_REQUIRE(timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, NULL) == 0);
+ ATF_REQUIRE(timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, &oits) == 0);
+ timespecadd(&delta, (&(const struct timespec){2, 0}), /* tick slop */
+ &delta);
+ ATF_CHECK_MSG(timespeccmp(&oits.it_value, &delta, <=),
+ "timerfd_settime returned %jd.%09lu remaining,"
+ " expected at most %jd.%09lu",
+ (intmax_t)oits.it_value.tv_sec, oits.it_value.tv_nsec,
+ (intmax_t)delta.tv_sec, delta.tv_nsec);
ATF_REQUIRE(timerfd_read(fd, &val) == 0);
ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &now) == 0);
ATF_REQUIRE(check_value_against_bounds(val, 1, 1));
@@ -389,22 +525,22 @@ ATF_TC_BODY(timerfd_select_poll_kevent_immed, tc)
ATF_REQUIRE((kq = kqueue()) >= 0);
EV_SET(&kev[0], fd, EVFILT_READ, EV_ADD, 0, 0, NULL);
ATF_REQUIRE(kevent(kq, kev, 1, NULL, 0, &ts) == 0);
+ EV_SET(&kev[0], fd, EVFILT_WRITE, EV_ADD, 0, 0, NULL);
+ ATF_CHECK_ERRNO(EINVAL, kevent(kq, kev, 1, NULL, 0, &ts) == -1);
/*
- * fd should be writable but not readable. Pass all of the
- * event bits; we should only get back POLLOUT | POLLWRNORM.
- * (It's writable only in so far as we'll get an error if we try.)
+ * fd should not be ready for anything. Pass all of the event
+ * bits; we should get back nothing.
*/
fds[0].fd = fd;
fds[0].events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI |
POLLOUT | POLLWRNORM | POLLWRBAND | POLLHUP;
fds[0].revents = 0;
- ATF_REQUIRE(poll(fds, 1, 0) == 1);
- ATF_REQUIRE(fds[0].revents == (POLLOUT | POLLWRNORM));
+ ATF_REQUIRE(poll(fds, 1, 0) == 0);
/*
- * As above; fd should only be set in writefds upon return
- * from the select() call.
+ * As above; fd should not be set on return from the select()
+ * call.
*/
FD_ZERO(&readfds);
FD_ZERO(&writefds);
@@ -414,9 +550,9 @@ ATF_TC_BODY(timerfd_select_poll_kevent_immed, tc)
FD_SET(fd, &readfds);
FD_SET(fd, &writefds);
FD_SET(fd, &exceptfds);
- ATF_REQUIRE(select(fd + 1, &readfds, &writefds, &exceptfds, &tv) == 1);
+ ATF_REQUIRE(select(fd + 1, &readfds, &writefds, &exceptfds, &tv) == 0);
ATF_REQUIRE(!FD_ISSET(fd, &readfds));
- ATF_REQUIRE(FD_ISSET(fd, &writefds));
+ ATF_REQUIRE(!FD_ISSET(fd, &writefds));
ATF_REQUIRE(!FD_ISSET(fd, &exceptfds));
/*
@@ -438,8 +574,7 @@ ATF_TC_BODY(timerfd_select_poll_kevent_immed, tc)
POLLOUT | POLLWRNORM | POLLWRBAND | POLLHUP;
fds[0].revents = 0;
ATF_REQUIRE(poll(fds, 1, 0) == 1);
- ATF_REQUIRE(fds[0].revents == (POLLIN | POLLRDNORM |
- POLLOUT | POLLWRNORM));
+ ATF_REQUIRE(fds[0].revents == (POLLIN | POLLRDNORM));
FD_ZERO(&readfds);
FD_ZERO(&writefds);
@@ -449,9 +584,9 @@ ATF_TC_BODY(timerfd_select_poll_kevent_immed, tc)
FD_SET(fd, &readfds);
FD_SET(fd, &writefds);
FD_SET(fd, &exceptfds);
- ATF_REQUIRE(select(fd + 1, &readfds, &writefds, &exceptfds, &tv) == 2);
+ ATF_REQUIRE(select(fd + 1, &readfds, &writefds, &exceptfds, &tv) == 1);
ATF_REQUIRE(FD_ISSET(fd, &readfds));
- ATF_REQUIRE(FD_ISSET(fd, &writefds));
+ ATF_REQUIRE(!FD_ISSET(fd, &writefds));
ATF_REQUIRE(!FD_ISSET(fd, &exceptfds));
/*
@@ -662,8 +797,12 @@ ATF_TC_BODY(timerfd_fcntl, tc)
ATF_TP_ADD_TCS(tp)
{
+
ATF_TP_ADD_TC(tp, timerfd_create);
+ ATF_TP_ADD_TC(tp, timerfd_write);
ATF_TP_ADD_TC(tp, timerfd_bogusfd);
+ ATF_TP_ADD_TC(tp, timerfd_invalidtime);
+ ATF_TP_ADD_TC(tp, timerfd_past);
ATF_TP_ADD_TC(tp, timerfd_block);
ATF_TP_ADD_TC(tp, timerfd_repeating);
ATF_TP_ADD_TC(tp, timerfd_abstime);
diff --git a/lib/libc/time/t_strptime.c b/lib/libc/time/t_strptime.c
index da0a5a5119a2..2e0992efd0d1 100644
--- a/lib/libc/time/t_strptime.c
+++ b/lib/libc/time/t_strptime.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_strptime.c,v 1.15 2018/06/03 08:48:37 maya Exp $ */
+/* $NetBSD: t_strptime.c,v 1.17 2024/03/26 21:52:23 rillig Exp $ */
/*-
* Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -32,11 +32,13 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_strptime.c,v 1.15 2018/06/03 08:48:37 maya Exp $");
+__RCSID("$NetBSD: t_strptime.c,v 1.17 2024/03/26 21:52:23 rillig Exp $");
-#include <time.h>
-#include <stdlib.h>
+#include <errno.h>
+#include <inttypes.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
#include <atf-c.h>
@@ -441,6 +443,151 @@ ATF_TC_BODY(Zone, tc)
ztest("%Z");
}
+ATF_TC(posixtime_overflow);
+
+ATF_TC_HEAD(posixtime_overflow, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr",
+ "Checks strptime(3) safely rejects POSIX time overflow");
+}
+
+ATF_TC_BODY(posixtime_overflow, tc)
+{
+ static const uint64_t P[] = { /* cases that should pass round-trip */
+ [0] = 0,
+ [1] = 1,
+ [2] = 2,
+ [3] = 0x7ffffffe,
+ [4] = 0x7fffffff,
+ [5] = 0x80000000,
+ [6] = 0x80000001,
+ [7] = 0xfffffffe,
+ [8] = 0xffffffff,
+ [9] = 0x100000000,
+ [10] = 0x100000001,
+ [11] = 67767976233532799, /* 2147483647-12-31T23:59:59 */
+ /*
+ * Beyond this point, the year (.tm_year + 1900)
+ * overflows the signed 32-bit range, so we won't be
+ * able to test round-trips:
+ */
+ [12] = 67767976233532800,
+ [13] = 67767976233532801,
+ [14] = 67768036191676799,
+ /*
+ * Beyond this point, .tm_year itself overflows the
+ * signed 32-bit range, so strptime won't work at all;
+ * the output can't be represented in struct tm.
+ */
+#if 0
+ [15] = 67768036191676800,
+ [16] = 67768036191676801,
+ [17] = 0x7ffffffffffffffe,
+ [18] = 0x7fffffffffffffff,
+#endif
+ };
+ static const uint64_t F[] = { /* cases strptime should reject */
+ [0] = 67768036191676800,
+ [1] = 67768036191676801,
+ [2] = 0x7ffffffffffffffe,
+ [3] = 0x7fffffffffffffff,
+ [4] = 0x8000000000000000,
+ [5] = 0x8000000000000001,
+ [6] = 0xfffffffffffffffe,
+ [7] = 0xffffffffffffffff,
+ };
+ size_t i;
+
+ /*
+ * Verify time_t fits in uint64_t, with space to spare since
+ * it's signed.
+ */
+ __CTASSERT(__type_max(time_t) < __type_max(uint64_t));
+
+ /*
+ * Make sure we work in UTC so this test doesn't depend on
+ * which time zone your machine is configured for.
+ */
+ setenv("TZ", "UTC", 1);
+
+ /*
+ * Check the should-pass cases.
+ */
+ for (i = 0; i < __arraycount(P); i++) {
+ char buf[sizeof("18446744073709551616")];
+ int n;
+ struct tm tm;
+ time_t t;
+ int error;
+
+ /*
+ * Format the integer in decimal.
+ */
+ n = snprintf(buf, sizeof(buf), "%"PRIu64, P[i]);
+ ATF_CHECK_MSG(n >= 0 && (unsigned)n < sizeof(buf),
+ "P[%zu]: 64-bit requires %d digits", i, n);
+
+ /*
+ * Parse the time into components.
+ */
+ fprintf(stderr, "# P[%zu]: %"PRId64"\n", i, P[i]);
+ if (strptime(buf, "%s", &tm) == NULL) {
+ atf_tc_fail_nonfatal("P[%zu]: strptime failed", i);
+ continue;
+ }
+ fprintf(stderr, "tm_sec=%d\n", tm.tm_sec);
+ fprintf(stderr, "tm_min=%d\n", tm.tm_min);
+ fprintf(stderr, "tm_hour=%d\n", tm.tm_hour);
+ fprintf(stderr, "tm_mday=%d\n", tm.tm_mday);
+ fprintf(stderr, "tm_mon=%d\n", tm.tm_mon);
+ fprintf(stderr, "tm_year=%d\n", tm.tm_year);
+ fprintf(stderr, "tm_wday=%d\n", tm.tm_wday);
+ fprintf(stderr, "tm_yday=%d\n", tm.tm_yday);
+ fprintf(stderr, "tm_isdst=%d\n", tm.tm_isdst);
+ fprintf(stderr, "tm_gmtoff=%ld\n", tm.tm_gmtoff);
+ fprintf(stderr, "tm_zone=%s\n", tm.tm_zone);
+
+ /*
+ * Convert back to POSIX seconds since epoch -- unless
+ * the year number overflows signed 32-bit, in which
+ * case stop here because we can't test further.
+ */
+ if (tm.tm_year > 0x7fffffff - 1900)
+ continue;
+ t = mktime(&tm);
+ error = errno;
+ ATF_CHECK_MSG(t != -1, "P[%zu]: mktime failed: %d, %s",
+ i, error, strerror(error));
+
+ /*
+ * Verify the round-trip.
+ */
+ ATF_CHECK_EQ_MSG(P[i], (uint64_t)t,
+ "P[%zu]: %"PRId64" -> %"PRId64, i, P[i], (int64_t)t);
+ }
+
+ /*
+ * Check the should-fail cases.
+ */
+ for (i = 0; i < __arraycount(F); i++) {
+ char buf[sizeof("18446744073709551616")];
+ int n;
+
+ /*
+ * Format the integer in decimal.
+ */
+ n = snprintf(buf, sizeof(buf), "%"PRIu64, F[i]);
+ ATF_CHECK_MSG(n >= 0 && (unsigned)n < sizeof(buf),
+ "F[%zu]: 64-bit requires %d digits", i, n);
+
+ /*
+ * Verify strptime rejects this.
+ */
+ h_fail(buf, "%s");
+ }
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -452,6 +599,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, year);
ATF_TP_ADD_TC(tp, zone);
ATF_TP_ADD_TC(tp, Zone);
+ ATF_TP_ADD_TC(tp, posixtime_overflow);
return atf_no_error();
}
diff --git a/lib/libc/ttyio/t_ptm.c b/lib/libc/ttyio/t_ptm.c
index 4428ee338931..52c2101535ca 100644
--- a/lib/libc/ttyio/t_ptm.c
+++ b/lib/libc/ttyio/t_ptm.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ptm.c,v 1.2 2023/05/17 03:16:11 gutteridge Exp $ */
+/* $NetBSD: t_ptm.c,v 1.3 2025/08/05 23:59:42 gutteridge Exp $ */
/*
* Copyright (c) 2004, 2008 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_ptm.c,v 1.2 2023/05/17 03:16:11 gutteridge Exp $");
+__RCSID("$NetBSD: t_ptm.c,v 1.3 2025/08/05 23:59:42 gutteridge Exp $");
#include <sys/ioctl.h>
#include <sys/stat.h>
@@ -170,23 +170,22 @@ ATF_TC_HEAD(ptmx_extra, tc)
{
atf_tc_set_md_var(tc, "descr", "Checks /dev/ptmx device "
- "applies O_NONBLOCK and O_CLOEXEC");
+ "applies O_NONBLOCK, O_CLOEXEC, and O_CLOFORK");
}
ATF_TC_BODY(ptmx_extra, tc)
{
int fdm;
- if ((fdm = posix_openpt(O_RDWR|O_NOCTTY|O_NONBLOCK|O_CLOEXEC)) == -1) {
+ if ((fdm = posix_openpt(O_RDWR|O_NONBLOCK|O_CLOEXEC|O_CLOFORK)) == -1) {
if (errno == ENOENT || errno == ENODEV)
atf_tc_skip("/dev/ptmx: %s", strerror(errno));
atf_tc_fail("/dev/ptmx: %s", strerror(errno));
}
- /* O_NOCTTY is ignored, not set. */
ATF_CHECK_EQ(O_RDWR|O_NONBLOCK, fcntl(fdm, F_GETFL));
- ATF_CHECK_EQ(FD_CLOEXEC, fcntl(fdm, F_GETFD));
+ ATF_CHECK_EQ(FD_CLOEXEC|FD_CLOFORK, fcntl(fdm, F_GETFD));
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libcurses/check_files/addstr3.chk b/lib/libcurses/check_files/addstr3.chk
index bd78a455fb9d..4a11aab00967 100644
--- a/lib/libcurses/check_files/addstr3.chk
+++ b/lib/libcurses/check_files/addstr3.chk
@@ -1,2 +1,2 @@
-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*cup24;1X()cup24;76Xel ()clearcup23;76Xa
+0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*cup24;1X()cup24;76Xel ()clearcup23;76Xa
hello \ No newline at end of file
diff --git a/lib/libcurses/check_files/color_blank_draw.chk b/lib/libcurses/check_files/color_blank_draw.chk
index 182a0b2ae494..8ace183ca92f 100644
--- a/lib/libcurses/check_files/color_blank_draw.chk
+++ b/lib/libcurses/check_files/color_blank_draw.chk
@@ -1,24 +1,24 @@
setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xel
-setaf7Xsetab0Xelhomeop \ No newline at end of file
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+el
+elhomeop \ No newline at end of file
diff --git a/lib/libcurses/check_files/slk6.chk b/lib/libcurses/check_files/slk6.chk
index ac1cef89d434..b67f8aeac4dd 100644
--- a/lib/libcurses/check_files/slk6.chk
+++ b/lib/libcurses/check_files/slk6.chk
@@ -1 +1 @@
-op setaf7Xsetab0Xsmulrev setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0Xosetaf7Xsetab0Xnsetaf7Xsetab0Xesgr0setaf7Xsetab0X setaf7Xsetab0Xsmulrev setaf7Xsetab0X setaf7Xsetab0Xtsetaf7Xsetab0Xwsetaf7Xsetab0Xosetaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X sgr0setaf7Xsetab0X setaf7Xsetab0Xsmulrev setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X sgr0setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf1Xsetab2Xsmulrev setaf1Xsetab2X setaf1Xsetab2X setaf1Xsetab2X setaf1Xsetab2Xfsetaf1Xsetab2Xosetaf1Xsetab2Xusetaf1Xsetab2Xrsgr0setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0Xsmulrev setaf7Xsetab0X setaf7Xsetab0Xfsetaf7Xsetab0Xisetaf7Xsetab0Xvsetaf7Xsetab0Xesetaf7Xsetab0X setaf7Xsetab0X sgr0setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0Xsmulrev setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X sgr0setaf7Xsetab0X setaf7Xsetab0Xsmulrev setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X setaf7Xsetab0X sgr0setaf7Xsetab0X setaf7Xsetab0Xsmulrevesetaf7Xsetab0Xisetaf7Xsetab0Xgsetaf7Xsetab0Xhsetaf7Xsetab0Xtsetaf7Xsetab0X!setaf7Xsetab0X!rmamsetaf7Xsetab0X!smamcup24;40Xrmulsgr0op \ No newline at end of file
+op setaf7Xsetab0Xsmulrev onesgr0 smulrev two sgr0 smulrev sgr0 setaf1Xsetab2Xsmulrev foursgr0setaf7Xsetab0X smulrev five sgr0 smulrev sgr0 smulrev sgr0 smulreveight!!rmam!smamcup24;40Xrmulsgr0op \ No newline at end of file
diff --git a/lib/libcurses/check_files/waddstr2.chk b/lib/libcurses/check_files/waddstr2.chk
index 5eb53e5a1888..fbcba16564a7 100644
--- a/lib/libcurses/check_files/waddstr2.chk
+++ b/lib/libcurses/check_files/waddstr2.chk
@@ -1,3 +1,6 @@
-012345cup5;6X6cup6;8Xel
+ 8el
+ 012345
+ 012345
+ 6 el
8el
el \ No newline at end of file
diff --git a/lib/libcurses/debug_test b/lib/libcurses/debug_test
index 43cb80e905e7..9450215bb15e 100755
--- a/lib/libcurses/debug_test
+++ b/lib/libcurses/debug_test
@@ -26,10 +26,13 @@ usage() {
echo " ${CURSES_TRACE_FILE}"
echo " -L : Add the argument as a prefix to LD_LIBRARY_PATH to"
echo " use an alternate libcurses version"
+ echo " -n : Add the nofail option to the director invocation"
+ echo " : so the director won't exit on check_file mismatch"
echo " -s : Specify the slave command. Defaults to \"../slave/slave\""
echo " -v : Enable verbose output"
echo " -g : Enable check file generation if the file does not exists"
echo " -f : Forces check file generation if -g flag is set"
+ echo " -t : Specify the TERM to use for the tests"
echo
}
@@ -41,7 +44,7 @@ usage() {
#ARGS="-T ${BASEDIR} -I ${INCLUDE_PATH} -C ${CHECK_PATH}"
ARGS="-T ${BASEDIR} -C ${CHECK_PATH}"
#
-while getopts cf:F:L:s:vg opt
+while getopts cf:F:L:ns:t:vg opt
do
case "${opt}" in
c)
@@ -60,10 +63,18 @@ do
LD_LIBRARY_PATH=${OPTARG}:${LD_LIBRARY_PATH}
;;
+ n)
+ ARGS="-n ${ARGS} "
+ ;;
+
s)
SLAVE=${OPTARG}
;;
+ t)
+ ARGS="-t ${OPTARG} ${ARGS}"
+ ;;
+
v)
ARGS="-v ${ARGS}"
;;
diff --git a/lib/libcurses/director/director.c b/lib/libcurses/director/director.c
index 5646da1c7fbe..d384889ad215 100644
--- a/lib/libcurses/director/director.c
+++ b/lib/libcurses/director/director.c
@@ -1,4 +1,4 @@
-/* $NetBSD: director.c,v 1.29 2021/06/10 07:21:07 mcf Exp $ */
+/* $NetBSD: director.c,v 1.30 2024/07/18 22:10:51 blymn Exp $ */
/*-
* Copyright 2009 Brett Lymn <blymn@NetBSD.org>
@@ -57,6 +57,7 @@ saved_data_t saved_output; /* In testlang_conf.y */
int to_slave;
int from_slave;
int master; /* pty to the slave */
+int nofail; /* don't exit on check file fail */
int verbose; /* control verbosity of tests */
int check_file_flag; /* control check-file generation */
const char *check_path; /* path to prepend to check files for output
@@ -136,10 +137,11 @@ main(int argc, char *argv[])
int pipe_to_slave[2], pipe_from_slave[2];
termpath = term = slave = NULL;
+ nofail = 0;
verbose = 0;
check_file_flag = 0;
- while ((ch = getopt(argc, argv, "vgfC:s:t:T:")) != -1) {
+ while ((ch = getopt(argc, argv, "nvgfC:s:t:T:")) != -1) {
switch (ch) {
case 'C':
check_path = optarg;
@@ -147,6 +149,9 @@ main(int argc, char *argv[])
case 'T':
termpath = optarg;
break;
+ case 'n':
+ nofail = 1;
+ break;
case 's':
slave = optarg;
break;
diff --git a/lib/libcurses/director/testlang_conf.l b/lib/libcurses/director/testlang_conf.l
index 57b0128e1291..76c00642194e 100644
--- a/lib/libcurses/director/testlang_conf.l
+++ b/lib/libcurses/director/testlang_conf.l
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: testlang_conf.l,v 1.26 2021/11/15 21:45:46 blymn Exp $ */
+/* $NetBSD: testlang_conf.l,v 1.27 2023/12/10 18:04:55 rillig Exp $ */
/*-
* Copyright 2009 Brett Lymn <blymn@NetBSD.org>
@@ -86,7 +86,11 @@ dequote(const char *s, size_t *len)
(p[2] - '0');
p += 3;
} else {
- *q++ = *p++;
+ errx(2,
+ "%s:%zu: Invalid escape sequence "
+ "'\\%c' in string literal; octal "
+ "numbers must be 3 digits wide",
+ cur_file, line, *p);
}
continue;
}
diff --git a/lib/libcurses/director/testlang_parse.y b/lib/libcurses/director/testlang_parse.y
index 65184e42b3de..d94e6ee619e6 100644
--- a/lib/libcurses/director/testlang_parse.y
+++ b/lib/libcurses/director/testlang_parse.y
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: testlang_parse.y,v 1.53 2021/06/13 11:06:20 rillig Exp $ */
+/* $NetBSD: testlang_parse.y,v 1.55 2024/07/18 22:10:51 blymn Exp $ */
/*-
* Copyright 2009 Brett Lymn <blymn@NetBSD.org>
@@ -55,6 +55,7 @@ extern int master;
extern struct pollfd readfd;
extern char *check_path;
extern char *cur_file; /* from director.c */
+extern int nofail; /* from director.c */
int yylex(void);
@@ -141,7 +142,7 @@ static void save_slave_output(bool);
static void validate_type(data_enum_t, ct_data_t *, int);
static void set_var(data_enum_t, const char *, void *);
static void validate_reference(int, void *);
-static char * numeric_or(char *, char *);
+static char * numeric_or(const char *, const char *);
static char * get_numeric_var(const char *);
static void perform_delay(struct timespec *);
static void set_cchar(char *, void *);
@@ -517,7 +518,7 @@ get_numeric_var(const char *var)
* Perform a bitwise OR on two numbers and return the result.
*/
static char *
-numeric_or(char *n1, char *n2)
+numeric_or(const char *n1, const char *n2)
{
unsigned long i1, i2, result;
char *ret;
@@ -1004,7 +1005,7 @@ compare_streams(const char *filename, bool discard)
data, (data >= ' ' )? data : '-');
}
- if (!create_check_file && ref != data) {
+ if (!nofail && !create_check_file && ref != data) {
errx(2, "%s:%zu: refresh data from slave does "
"not match expected from file %s offset %zu "
"[reference 0x%02x (%c) != slave 0x%02x (%c)]",
@@ -1029,7 +1030,7 @@ compare_streams(const char *filename, bool discard)
}
/* discard any excess saved output if required */
- if (discard) {
+ if (discard || nofail) {
saved_output.count = 0;
saved_output.readp = 0;
}
diff --git a/lib/libcurses/slave/commands.c b/lib/libcurses/slave/commands.c
index 7a2db6ecc996..979742314f3e 100644
--- a/lib/libcurses/slave/commands.c
+++ b/lib/libcurses/slave/commands.c
@@ -1,4 +1,4 @@
-/* $NetBSD: commands.c,v 1.17 2021/12/06 22:45:42 rillig Exp $ */
+/* $NetBSD: commands.c,v 1.18 2023/12/10 15:42:29 rillig Exp $ */
/*-
* Copyright 2009 Brett Lymn <blymn@NetBSD.org>
@@ -194,7 +194,7 @@ report_message(data_enum_t type, const char *status)
}
/*
- * Report a string of chtype back to the director via the command pipe.
+ * Report a single chtype back to the director via the command pipe.
*/
void
report_byte(chtype c)
diff --git a/lib/libcurses/t_curses.sh b/lib/libcurses/t_curses.sh
index c8eb6bfbccea..32a5f84ca686 100644
--- a/lib/libcurses/t_curses.sh
+++ b/lib/libcurses/t_curses.sh
@@ -1487,7 +1487,7 @@ clear_body()
atf_test_case clearok
clearok_head()
{
- atf_set "descr" "Check clearing of screen during a refresh if correspnding flag is set"
+ atf_set "descr" "Check clearing of screen during a refresh if corresponding flag is set"
}
clearok_body()
{
diff --git a/lib/libcurses/testframe.txt b/lib/libcurses/testframe.txt
index d19c01b6397e..c3e60cc45134 100644
--- a/lib/libcurses/testframe.txt
+++ b/lib/libcurses/testframe.txt
@@ -1,4 +1,4 @@
-$NetBSD: testframe.txt,v 1.8 2021/02/09 20:31:02 rillig Exp $
+$NetBSD: testframe.txt,v 1.9 2023/12/03 09:42:36 rillig Exp $
CURSES TESTFRAME
----------------
@@ -231,6 +231,7 @@ performed on them when they are parsed. This allows the tester to
embed some control characters into the string. Valid substitutions
are:
+ \b backspace
\e escape
\n new line
\r carriage return
@@ -240,9 +241,6 @@ are:
represented by the octal number will be inserted into
the string.
-Any other invalid conversions will have the \ stripped and the
-subsequent characters inserted into the string.
-
Integers may be specified by either a plain numeric (e.g. 12345) or by
hexadecimal notation by prefixing the number with 0x (e.g. 0x3039).
Internally, no distinction is made between the two formats and they
diff --git a/lib/libcurses/tests/curs_set b/lib/libcurses/tests/curs_set
index 5d7cb548dc09..f99c74ca0952 100644
--- a/lib/libcurses/tests/curs_set
+++ b/lib/libcurses/tests/curs_set
@@ -1,5 +1,5 @@
include start
-call 2 curs_set 0
+call 1 curs_set 0
compare curs_set1.chk
call 0 curs_set 1
compare curs_set2.chk
diff --git a/lib/libdes/t_des.c b/lib/libdes/t_des.c
index c29bfe1b9e0a..bbe665b16ec3 100644
--- a/lib/libdes/t_des.c
+++ b/lib/libdes/t_des.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_des.c,v 1.2 2021/12/05 07:33:56 msaitoh Exp $ */
+/* $NetBSD: t_des.c,v 1.3 2024/02/10 18:43:53 andvar Exp $ */
/*
* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights
@@ -247,7 +247,7 @@ static unsigned char cbc_ok[32] = {
};
#ifdef SCREW_THE_PARITY
-#error "SCREW_THE_PARITY is not ment to be defined."
+#error "SCREW_THE_PARITY is not meant to be defined."
#error "Original vectors are preserved for reference only."
static unsigned char cbc2_key[8] = {
0xf0, 0xe1, 0xd2, 0xc3, 0xb4, 0xa5, 0x96, 0x87,
diff --git a/lib/libexecinfo/Makefile b/lib/libexecinfo/Makefile
index 2dde350d21d0..c4ebd5cdadbf 100644
--- a/lib/libexecinfo/Makefile
+++ b/lib/libexecinfo/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.8 2021/11/23 23:29:55 thorpej Exp $
+# $NetBSD: Makefile,v 1.9 2025/01/23 12:32:38 christos Exp $
.include <bsd.own.mk>
@@ -6,6 +6,7 @@ TESTSDIR= ${TESTSBASE}/lib/libexecinfo
TESTS_C+= t_backtrace
TESTS_C+= t_sig_backtrace
+TESTS_C+= t_backtrace_sandbox
STRIPFLAG=
LDADD+= -lexecinfo -lelf
diff --git a/lib/libexecinfo/t_sig_backtrace.c b/lib/libexecinfo/t_sig_backtrace.c
index 2d35e28c6688..e4099f68bf12 100644
--- a/lib/libexecinfo/t_sig_backtrace.c
+++ b/lib/libexecinfo/t_sig_backtrace.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sig_backtrace.c,v 1.7 2023/07/06 20:44:55 riastradh Exp $ */
+/* $NetBSD: t_sig_backtrace.c,v 1.8 2025/04/17 14:18:40 riastradh Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_sig_backtrace.c,v 1.7 2023/07/06 20:44:55 riastradh Exp $");
+__RCSID("$NetBSD: t_sig_backtrace.c,v 1.8 2025/04/17 14:18:40 riastradh Exp $");
#include <sys/mman.h>
#include <execinfo.h>
@@ -171,10 +171,10 @@ handler(int s)
}
}
- ATF_REQUIRE(found_handler);
- ATF_REQUIRE(found_sigtramp);
- ATF_REQUIRE(found_the_loop);
- ATF_REQUIRE(found_main);
+ ATF_CHECK(found_handler);
+ ATF_CHECK(found_sigtramp);
+ ATF_CHECK(found_the_loop);
+ ATF_CHECK(found_main);
longjmp(env, 1);
}
@@ -202,6 +202,11 @@ ATF_TC_BODY(sig_backtrace_deref, tc)
};
ATF_REQUIRE(sigaction(SIGSEGV, &sa, NULL) == 0);
+#ifdef __sparc__ /* 32 or 64 */
+ atf_tc_expect_fail("PR port-sparc64/59313:"
+ " t_sig_backtrace tests are failing");
+#endif
+
if (setjmp(env) == 0) {
printf("%d\n", the_loop_deref(0));
}
diff --git a/lib/libm/Makefile b/lib/libm/Makefile
index a677bfcb392a..23f4d004226b 100644
--- a/lib/libm/Makefile
+++ b/lib/libm/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.48 2022/08/27 08:31:58 christos Exp $
+# $NetBSD: Makefile,v 1.54 2025/09/16 08:50:35 nat Exp $
.include <bsd.own.mk>
@@ -25,6 +25,7 @@ TESTS_C+= t_ceil
TESTS_C+= t_cos
TESTS_C+= t_cosh
TESTS_C+= t_erf
+TESTS_C+= t_errhandling
TESTS_C+= t_exp
TESTS_C+= t_fenv
TESTS_C+= t_fe_round
@@ -35,8 +36,10 @@ TESTS_C+= t_infinity
TESTS_C+= t_ldexp
TESTS_C+= t_log
TESTS_C+= t_modf
+TESTS_C+= t_next
TESTS_C+= t_pow
TESTS_C+= t_precision
+TESTS_C+= t_remquo
TESTS_C+= t_round
TESTS_C+= t_scalbn
TESTS_C+= t_sin
diff --git a/lib/libm/t_asin.c b/lib/libm/t_asin.c
index 9b7a5922584f..386f942f376f 100644
--- a/lib/libm/t_asin.c
+++ b/lib/libm/t_asin.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_asin.c,v 1.4 2018/11/07 03:59:36 riastradh Exp $ */
+/* $NetBSD: t_asin.c,v 1.5 2024/05/11 21:27:53 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -240,8 +240,9 @@ ATF_TC_BODY(asinf_inrange, tc)
float y = values[i].y;
if (fabs(x) == 0.5)
- atf_tc_expect_fail("asinf is busted,"
- " gives ~2ulp error");
+ atf_tc_expect_fail("PR lib/58246:"
+ " asinf gives ~2ulp error"
+ " when it should give <1ulp");
if (!(fabsf((asinf(x) - y)/y) <= eps)) {
atf_tc_fail_nonfatal("asinf(%.8g) = %.8g != %.8g,"
" error=~%.1fulp",
diff --git a/lib/libm/t_bit.c b/lib/libm/t_bit.c
index b6e0218f601c..22a7af284f2a 100644
--- a/lib/libm/t_bit.c
+++ b/lib/libm/t_bit.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_bit.c,v 1.1 2019/04/26 08:52:16 maya Exp $ */
+/* $NetBSD: t_bit.c,v 1.2 2024/05/06 18:41:23 riastradh Exp $ */
/*
* Written by Maya Rashish <maya@NetBSD.org>
@@ -7,6 +7,9 @@
* Testing signbit{,f,l} function correctly
*/
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_bit.c,v 1.2 2024/05/06 18:41:23 riastradh Exp $");
+
#include <atf-c.h>
#include <float.h>
#include <math.h>
@@ -18,79 +21,85 @@ static const struct {
double input;
bool is_negative;
} values[] = {
- { -1, true},
- { -123, true},
- { -123E6, true},
-#ifdef INFINITY
- { -INFINITY, true},
- { INFINITY, false},
-#endif
- { 123E6, false},
- { 0, false},
- { -FLT_MIN, true},
- { FLT_MIN, false},
- /*
+ { -1, true },
+ { -123, true },
+ { -123E6, true },
+ { -INFINITY, true },
+ { INFINITY, false },
+ { 123E6, false },
+ { 0, false },
+ { -0., true },
+ { -FLT_MIN, true },
+ { FLT_MIN, false },
+ /*
* Cannot be accurately represented as float,
* but sign should be preserved
*/
- { DBL_MAX, false},
- { -DBL_MAX, true},
+ { DBL_MAX, false },
+ { -DBL_MAX, true },
};
-#ifdef __HAVE_LONG_DOUBLE
static const struct {
long double input;
bool is_negative;
} ldbl_values[] = {
- { -LDBL_MIN, true},
- { LDBL_MIN, false},
- { LDBL_MAX, false},
- { -LDBL_MAX, true},
+ { -LDBL_MIN, true },
+ { LDBL_MIN, false },
+ { LDBL_MAX, false },
+ { -LDBL_MAX, true },
};
-#endif
ATF_TC(signbit);
ATF_TC_HEAD(signbit, tc)
{
- atf_tc_set_md_var(tc, "descr","Check that signbit functions correctly");
+ atf_tc_set_md_var(tc, "descr",
+ "Check that signbit functions correctly");
}
ATF_TC_BODY(signbit, tc)
{
- double iterator_d;
- float iterator_f;
+ unsigned i;
+
+ for (i = 0; i < __arraycount(values); i++) {
+ const float iterator_f = values[i].input;
+ const double iterator_d = values[i].input;
+ const long double iterator_l = values[i].input;
- for (unsigned int i = 0; i < __arraycount(values); i++) {
- iterator_d = values[i].input;
- iterator_f = (float) values[i].input;
- if (signbit(iterator_f) != values[i].is_negative)
+ if (signbit(iterator_f) != values[i].is_negative) {
atf_tc_fail("%s:%d iteration %d signbitf is wrong"
- " about the sign of %f", __func__,
- __LINE__, i, iterator_f);
- if (signbit(iterator_d) != values[i].is_negative)
+ " about the sign of %f", __func__, __LINE__, i,
+ iterator_f);
+ }
+ if (signbit(iterator_d) != values[i].is_negative) {
atf_tc_fail("%s:%d iteration %d signbit is wrong"
- "about the sign of %f", __func__,
- __LINE__,i, iterator_d);
-
-#ifdef __HAVE_LONG_DOUBLE
- long double iterator_l = values[i].input;
- if (signbit(iterator_l) != values[i].is_negative)
+ "about the sign of %f", __func__, __LINE__, i,
+ iterator_d);
+ }
+ if (signbit(iterator_l) != values[i].is_negative) {
atf_tc_fail("%s:%d iteration %d signbitl is wrong"
- " about the sign of %Lf", __func__,
- __LINE__, i, iterator_l);
-#endif
+ " about the sign of %Lf", __func__, __LINE__, i,
+ iterator_l);
+ }
}
-#ifdef __HAVE_LONG_DOUBLE
- for (unsigned int i = 0; i < __arraycount(ldbl_values); i++) {
- if (signbit(ldbl_values[i].input) != ldbl_values[i].is_negative)
+ for (i = 0; i < __arraycount(ldbl_values); i++) {
+ if (signbit(ldbl_values[i].input) !=
+ ldbl_values[i].is_negative) {
atf_tc_fail("%s:%d iteration %d signbitl is"
- "wrong about the sign of %Lf",
- __func__, __LINE__, i,
- ldbl_values[i].input);
+ "wrong about the sign of %Lf",
+ __func__, __LINE__, i,
+ ldbl_values[i].input);
+ }
}
-#endif
+#ifdef NAN
+ ATF_CHECK_EQ(signbit(copysignf(NAN, -1)), true);
+ ATF_CHECK_EQ(signbit(copysignf(NAN, +1)), false);
+ ATF_CHECK_EQ(signbit(copysign(NAN, -1)), true);
+ ATF_CHECK_EQ(signbit(copysign(NAN, +1)), false);
+ ATF_CHECK_EQ(signbit(copysignl(NAN, -1)), true);
+ ATF_CHECK_EQ(signbit(copysignl(NAN, +1)), false);
+#endif
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libm/t_cabsl.cxx b/lib/libm/t_cabsl.cxx
index 7dd119b1da3b..a5d792edb1c8 100644
--- a/lib/libm/t_cabsl.cxx
+++ b/lib/libm/t_cabsl.cxx
@@ -43,21 +43,15 @@ ATF_TEST_CASE_BODY(cabsl)
{
int sum = 0;
-#ifdef __HAVE_LONG_DOUBLE
std::complex<long double> cld(3.0,4.0);
sum += std::abs(cld);
-#endif
std::complex<double> cd(3.0,4.0);
sum += std::abs(cd);
std::complex<float> cf(3.0,4.0);
sum += std::abs(cf);
-#ifdef __HAVE_LONG_DOUBLE
ATF_REQUIRE_EQ(sum, 3*5);
-#else
- ATF_REQUIRE_EQ(sum, 2*5);
-#endif
}
ATF_INIT_TEST_CASES(tcs)
diff --git a/lib/libm/t_cbrt.c b/lib/libm/t_cbrt.c
index d3b3300d3d43..60897dc2e811 100644
--- a/lib/libm/t_cbrt.c
+++ b/lib/libm/t_cbrt.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_cbrt.c,v 1.5 2018/11/15 05:14:20 riastradh Exp $ */
+/* $NetBSD: t_cbrt.c,v 1.6 2024/04/03 01:52:28 christos Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_cbrt.c,v 1.5 2018/11/15 05:14:20 riastradh Exp $");
+__RCSID("$NetBSD: t_cbrt.c,v 1.6 2024/04/03 01:52:28 christos Exp $");
#include <atf-c.h>
#include <float.h>
@@ -285,12 +285,9 @@ ATF_TC_BODY(cbrtl_powl, tc)
const long double eps = 2*LDBL_EPSILON;
size_t i;
-#if LDBL_MANT_DIG > DBL_MANT_DIG
- atf_tc_expect_fail("powl not yet implemented with full precision");
-#endif
for (i = 0; i < __arraycount(x); i++) {
long double x_cbrt = cbrtl(x[i]);
- long double x_pow13 = powl(x[i], 1.0 / 3.0);
+ long double x_pow13 = powl(x[i], 1.0L / 3.0L);
bool ok;
if (x[i] == 0) {
diff --git a/lib/libm/t_cos.c b/lib/libm/t_cos.c
index ca5f0aab7ffa..308fc6675da1 100644
--- a/lib/libm/t_cos.c
+++ b/lib/libm/t_cos.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_cos.c,v 1.9 2019/05/27 00:10:36 maya Exp $ */
+/* $NetBSD: t_cos.c,v 1.12 2024/06/09 16:53:12 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -60,7 +60,6 @@ static const struct {
{ 360, 6.283185307179586, 1.0000000000000000, 999 },
};
-#ifdef __HAVE_LONG_DOUBLE
/*
* cosl(3)
*/
@@ -115,9 +114,10 @@ ATF_TC_HEAD(cosl_inf_neg, tc)
ATF_TC_BODY(cosl_inf_neg, tc)
{
- const long double x = -1.0L / 0.0L;
+ const volatile long double x = -1.0L / 0.0L;
+ const long double y = cosl(x);
- ATF_CHECK(isnan(cosl(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%La", y);
}
ATF_TC(cosl_inf_pos);
@@ -128,12 +128,12 @@ ATF_TC_HEAD(cosl_inf_pos, tc)
ATF_TC_BODY(cosl_inf_pos, tc)
{
- const long double x = 1.0L / 0.0L;
+ const volatile long double x = 1.0L / 0.0L;
+ const long double y = cosl(x);
- ATF_CHECK(isnan(cosl(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%La", y);
}
-
ATF_TC(cosl_zero_neg);
ATF_TC_HEAD(cosl_zero_neg, tc)
{
@@ -159,7 +159,6 @@ ATF_TC_BODY(cosl_zero_pos, tc)
ATF_CHECK(cosl(x) == 1.0);
}
-#endif
/*
* cos(3)
@@ -211,9 +210,10 @@ ATF_TC_HEAD(cos_inf_neg, tc)
ATF_TC_BODY(cos_inf_neg, tc)
{
- const double x = -1.0L / 0.0L;
+ const volatile double x = -1.0 / 0.0;
+ const double y = cos(x);
- ATF_CHECK(isnan(cos(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
ATF_TC(cos_inf_pos);
@@ -224,12 +224,12 @@ ATF_TC_HEAD(cos_inf_pos, tc)
ATF_TC_BODY(cos_inf_pos, tc)
{
- const double x = 1.0L / 0.0L;
+ const volatile double x = 1.0 / 0.0;
+ const double y = cos(x);
- ATF_CHECK(isnan(cos(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
-
ATF_TC(cos_zero_neg);
ATF_TC_HEAD(cos_zero_neg, tc)
{
@@ -281,9 +281,10 @@ ATF_TC_BODY(cosf_angles, tc)
*
* The volatile should not be necessary, by C99 Sec.
* 5.2.4.2.2. para. 8 on p. 24 which specifies that
- * assignment and cast remove all extra range and precision,
- * but seems to be needed to work around a compiler bug.
- */
+ * assignment and cast remove all extra range and
+ * precision, but is needed when we compile with
+ * -std=gnu99 which doesn't implement this semantics.
+ */
volatile float result = cosf(theta);
if (cos_theta == 999)
@@ -319,12 +320,10 @@ ATF_TC_HEAD(cosf_inf_neg, tc)
ATF_TC_BODY(cosf_inf_neg, tc)
{
- const float x = -1.0L / 0.0L;
+ const volatile float x = -1.0f / 0.0f;
+ const float y = cosf(x);
- if (isnan(cosf(x)) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("cosf(-Inf) != NaN");
- }
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
ATF_TC(cosf_inf_pos);
@@ -335,12 +334,10 @@ ATF_TC_HEAD(cosf_inf_pos, tc)
ATF_TC_BODY(cosf_inf_pos, tc)
{
- const float x = 1.0L / 0.0L;
+ const volatile float x = 1.0f / 0.0f;
+ const float y = cosf(x);
- if (isnan(cosf(x)) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("cosf(+Inf) != NaN");
- }
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
@@ -372,14 +369,13 @@ ATF_TC_BODY(cosf_zero_pos, tc)
ATF_TP_ADD_TCS(tp)
{
-#ifdef __HAVE_LONG_DOUBLE
+
ATF_TP_ADD_TC(tp, cosl_angles);
ATF_TP_ADD_TC(tp, cosl_nan);
ATF_TP_ADD_TC(tp, cosl_inf_neg);
ATF_TP_ADD_TC(tp, cosl_inf_pos);
ATF_TP_ADD_TC(tp, cosl_zero_neg);
ATF_TP_ADD_TC(tp, cosl_zero_pos);
-#endif
ATF_TP_ADD_TC(tp, cos_angles);
ATF_TP_ADD_TC(tp, cos_nan);
diff --git a/lib/libm/t_fe_round.c b/lib/libm/t_fe_round.c
index 33da289eb156..776d9702e4d9 100644
--- a/lib/libm/t_fe_round.c
+++ b/lib/libm/t_fe_round.c
@@ -1,3 +1,5 @@
+/* $NetBSD: t_fe_round.c,v 1.21 2025/04/17 13:45:22 riastradh Exp $ */
+
/*
* Written by Maya Rashish <maya@NetBSD.org>
* Public domain.
@@ -5,254 +7,467 @@
* Testing IEEE-754 rounding modes (and lrint)
*/
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_fe_round.c,v 1.21 2025/04/17 13:45:22 riastradh Exp $");
+
#include <atf-c.h>
#include <fenv.h>
-#ifdef __HAVE_FENV
#include <math.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
+#ifdef __HAVE_FENV
+
/*#pragma STDC FENV_ACCESS ON gcc?? */
#define INT 9223L
-#define EPSILON 0.001
+static const char *
+rmname(int rm)
+{
+ switch (rm) {
+ case FE_TOWARDZERO:
+ return "FE_TOWARDZERO";
+ case FE_DOWNWARD:
+ return "FE_DOWNWARD";
+ case FE_UPWARD:
+ return "FE_UPWARD";
+ case FE_TONEAREST:
+ return "FE_TONEAREST";
+ default:
+ return "unknown";
+ }
+}
+/*
+ * Examples are chosen to fit within the smallest single-precision
+ * format any NetBSD port uses, so that we can write the examples once
+ * in type double, and convert to single without raising inexact-result
+ * exceptions when we're trying to test whether the integer-rounding
+ * functions raise them.
+ */
static const struct {
int round_mode;
double input;
long int expected;
} values[] = {
- { FE_DOWNWARD, 3.7, 3},
- { FE_DOWNWARD, -3.7, -4},
- { FE_DOWNWARD, +0, 0},
- { FE_DOWNWARD, -INT-0.01, -INT-1},
- { FE_DOWNWARD, +INT-0.01, INT-1},
- { FE_DOWNWARD, -INT+0.01, -INT},
- { FE_DOWNWARD, +INT+0.01, INT},
-#if 0 /* cpu bugs? */
- { FE_DOWNWARD, -0, -1},
+ { FE_DOWNWARD, 3.75, 3},
+ { FE_DOWNWARD, -3.75, -4},
+ { FE_DOWNWARD, +0., 0},
+ { FE_DOWNWARD, -0., 0},
+ { FE_DOWNWARD, -INT-0.0625, -INT-1},
+ { FE_DOWNWARD, +INT-0.0625, INT-1},
+ { FE_DOWNWARD, -INT+0.0625, -INT},
+ { FE_DOWNWARD, +INT+0.0625, INT},
- { FE_UPWARD, +0, 1},
-#endif
- { FE_UPWARD, -0, 0},
- { FE_UPWARD, -123.7, -123},
- { FE_UPWARD, 123.999, 124},
- { FE_UPWARD, -INT-0.01, -INT},
- { FE_UPWARD, +INT-0.01, INT},
- { FE_UPWARD, -INT+0.01, -INT+1},
- { FE_UPWARD, +INT+0.01, INT+1},
+ { FE_UPWARD, +0., 0},
+ { FE_UPWARD, -0., 0},
+ { FE_UPWARD, -123.75, -123},
+ { FE_UPWARD, 123.75, 124},
+ { FE_UPWARD, -INT-0.0625, -INT},
+ { FE_UPWARD, +INT-0.0625, INT},
+ { FE_UPWARD, -INT+0.0625, -INT+1},
+ { FE_UPWARD, +INT+0.0625, INT+1},
- { FE_TOWARDZERO, 1.99, 1},
- { FE_TOWARDZERO, -1.99, -1},
- { FE_TOWARDZERO, 0.2, 0},
- { FE_TOWARDZERO, INT+0.01, INT},
- { FE_TOWARDZERO, INT-0.01, INT - 1},
- { FE_TOWARDZERO, -INT+0.01, -INT + 1},
- { FE_TOWARDZERO, +0, 0},
- { FE_TOWARDZERO, -0, 0},
+ { FE_TOWARDZERO, 1.9375, 1},
+ { FE_TOWARDZERO, -1.9375, -1},
+ { FE_TOWARDZERO, 0.25, 0},
+ { FE_TOWARDZERO, INT+0.0625, INT},
+ { FE_TOWARDZERO, INT-0.0625, INT - 1},
+ { FE_TOWARDZERO, -INT+0.0625, -INT + 1},
+ { FE_TOWARDZERO, +0., 0},
+ { FE_TOWARDZERO, -0., 0},
- { FE_TONEAREST, -INT-0.01, -INT},
- { FE_TONEAREST, +INT-0.01, INT},
- { FE_TONEAREST, -INT+0.01, -INT},
- { FE_TONEAREST, +INT+0.01, INT},
- { FE_TONEAREST, -INT-0.501, -INT-1},
- { FE_TONEAREST, +INT-0.501, INT-1},
- { FE_TONEAREST, -INT+0.501, -INT+1},
- { FE_TONEAREST, +INT+0.501, INT+1},
- { FE_TONEAREST, +0, 0},
- { FE_TONEAREST, -0, 0},
+ { FE_TONEAREST, -INT-0.0625, -INT},
+ { FE_TONEAREST, +INT-0.0625, INT},
+ { FE_TONEAREST, -INT+0.0625, -INT},
+ { FE_TONEAREST, +INT+0.0625, INT},
+ { FE_TONEAREST, -INT-0.53125, -INT-1},
+ { FE_TONEAREST, +INT-0.53125, INT-1},
+ { FE_TONEAREST, -INT+0.53125, -INT+1},
+ { FE_TONEAREST, +INT+0.53125, INT+1},
+ { FE_TONEAREST, +0., 0},
+ { FE_TONEAREST, -0., 0},
};
-ATF_TC(fe_round);
-ATF_TC_HEAD(fe_round, tc)
+ATF_TC(fe_lrint);
+ATF_TC_HEAD(fe_lrint, tc)
{
- atf_tc_set_md_var(tc, "descr","Checking IEEE 754 rounding modes using lrint");
+ atf_tc_set_md_var(tc, "descr",
+ "Checking IEEE 754 rounding modes using lrint(3)");
}
-ATF_TC_BODY(fe_round, tc)
+ATF_TC_BODY(fe_lrint, tc)
{
+ enum {
+ LLRINT,
+ LLRINTF,
+ LRINT,
+ LRINTF,
+ N_FN,
+ } fn;
+ static const char *const fnname[] = {
+ [LLRINT] = "llrint",
+ [LLRINTF] = "llrintf",
+ [LRINT] = "lrint",
+ [LRINTF] = "lrintf",
+ };
long int received;
+ unsigned i;
- for (unsigned int i = 0; i < __arraycount(values); i++) {
- fesetround(values[i].round_mode);
+ for (i = 0; i < __arraycount(values); i++) {
+ for (fn = 0; fn < N_FN; fn++) {
+ /*
+ * Set the requested rounding mode.
+ */
+ fesetround(values[i].round_mode);
- received = lrint(values[i].input);
- ATF_CHECK_MSG(
- (labs(received - values[i].expected) < EPSILON),
- "lrint rounding wrong, difference too large\n"
- "input: %f (index %d): got %ld, expected %ld\n",
- values[i].input, i, received, values[i].expected);
+ /*
+ * Call the lrint(3)-family function.
+ */
+ switch (fn) {
+ case LLRINT:
+ received = llrint(values[i].input);
+ break;
+ case LLRINTF:
+ received = llrintf(values[i].input);
+ break;
+ case LRINT:
+ received = lrint(values[i].input);
+ break;
+ case LRINTF:
+ received = lrintf(values[i].input);
+ break;
+ default:
+ atf_tc_fail("impossible");
+ }
- /* Do we get the same rounding mode out? */
- ATF_CHECK_MSG(
- (fegetround() == values[i].round_mode),
- "Didn't get the same rounding mode out!\n"
- "(index %d) fed in %d rounding mode, got %d out\n",
- i, values[i].round_mode, fegetround());
+ /*
+ * Assuming the result we got has zero
+ * fractional part, casting to long int should
+ * have no rounding. Verify it matches the
+ * integer we expect.
+ */
+ ATF_CHECK_MSG((long int)received == values[i].expected,
+ "[%u] %s %s(%f): got %ld, expected %ld",
+ i, rmname(values[i].round_mode), fnname[fn],
+ values[i].input,
+ (long int)received, values[i].expected);
+
+ /* Do we get the same rounding mode out? */
+ ATF_CHECK_MSG(fegetround() == values[i].round_mode,
+ "[%u] %s: set %d (%s), got %d (%s)",
+ i, fnname[fn],
+ values[i].round_mode, rmname(values[i].round_mode),
+ fegetround(), rmname(fegetround()));
+ }
}
}
-ATF_TC(fe_nearbyint);
-ATF_TC_HEAD(fe_nearbyint, tc)
+ATF_TC(fe_nearbyint_rint);
+ATF_TC_HEAD(fe_nearbyint_rint, tc)
{
- atf_tc_set_md_var(tc, "descr","Checking IEEE 754 rounding modes using nearbyint");
+ atf_tc_set_md_var(tc, "descr",
+ "Checking IEEE 754 rounding modes using nearbyint/rint");
}
-ATF_TC_BODY(fe_nearbyint, tc)
+ATF_TC_BODY(fe_nearbyint_rint, tc)
{
- double received;
+ enum {
+ NEARBYINT,
+ NEARBYINTF,
+ NEARBYINTL,
+ RINT,
+ RINTF,
+ RINTL,
+ N_FN,
+ } fn;
+ static const char *const fnname[] = {
+ [NEARBYINT] = "nearbyint",
+ [NEARBYINTF] = "nearbyintf",
+ [NEARBYINTL] = "nearbyintl",
+ [RINT] = "rint",
+ [RINTF] = "rintf",
+ [RINTL] = "rintl",
+ };
+ double received, ipart, fpart;
+ unsigned i;
- for (unsigned int i = 0; i < __arraycount(values); i++) {
- fesetround(values[i].round_mode);
+#ifdef __sparc64__
+ atf_tc_expect_fail("PR port-sparc64/59310:"
+ " t_fe_round:fe_nearbyint_rint tests are failing");
+#endif
- received = nearbyint(values[i].input);
- ATF_CHECK_MSG(
- (fabs(received - values[i].expected) < EPSILON),
- "nearbyint rounding wrong, difference too large\n"
- "input: %f (index %d): got %f, expected %ld\n",
- values[i].input, i, received, values[i].expected);
+ for (i = 0; i < __arraycount(values); i++) {
+ for (fn = 0; fn < N_FN; fn++) {
+ bool expect_except =
+ values[i].input != (double)values[i].expected;
- /* Do we get the same rounding mode out? */
- ATF_CHECK_MSG(
- (fegetround() == values[i].round_mode),
- "Didn't get the same rounding mode out!\n"
- "(index %d) fed in %d rounding mode, got %d out\n",
- i, values[i].round_mode, fegetround());
- }
-}
+ /*
+ * Set the requested rounding mode.
+ */
+ fesetround(values[i].round_mode);
-static const struct {
- double input;
- double toward;
- double expected;
-} values2[] = {
- { 10.0, 11.0, 10.0 },
- { -5.0, -6.0, -5.0 },
-};
+#ifdef __ia64__
+/*
+ * Without this barrier, we get:
+ *
+ * /tmp//ccJayu9g.s:2793: Warning: Use of 'mov.m' violates RAW dependency 'AR[FPSR].sf0.flags' (impliedf)
+ * /tmp//ccJayu9g.s:2793: Warning: Only the first path encountering the conflict is reported
+ * /tmp//ccJayu9g.s:2757: Warning: This is the location of the conflicting usage
+ *
+ * (If you fix this, remove the entry from doc/HACKS.)
+ */
+ __insn_barrier();
+#endif
-ATF_TC(fe_nextafter);
-ATF_TC_HEAD(fe_nextafter, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Checking IEEE 754 rounding using nextafter()");
-}
+ /*
+ * Clear sticky floating-point exception bits
+ * so we can verify whether the FE_INEXACT
+ * exception is raised.
+ */
+ feclearexcept(FE_ALL_EXCEPT);
-ATF_TC_BODY(fe_nextafter, tc)
-{
- double received;
- int res;
+ /*
+ * Call the rint(3)-family function.
+ */
+ switch (fn) {
+ case NEARBYINT:
+ received = nearbyint(values[i].input);
+ expect_except = false;
+ break;
+ case NEARBYINTF:
+ received = nearbyintf(values[i].input);
+ expect_except = false;
+ break;
+ case NEARBYINTL:
+ received = nearbyintl(values[i].input);
+ expect_except = false;
+ break;
+ case RINT:
+ received = rint(values[i].input);
+ break;
+ case RINTF:
+ received = rintf(values[i].input);
+ break;
+ case RINTL:
+ received = rintl(values[i].input);
+ break;
+ default:
+ atf_tc_fail("impossible");
+ }
- for (unsigned int i = 0; i < __arraycount(values2); i++) {
- received = nextafter(values2[i].input, values2[i].toward);
- if (values2[i].input < values2[i].toward) {
- res = (received > values2[i].input);
- } else {
- res = (received < values2[i].input);
- }
- ATF_CHECK_MSG(
- res && (fabs(received - values2[i].expected) < EPSILON),
- "nextafter() rounding wrong, difference too large\n"
- "input: %f (index %d): got %f, expected %f, res %d\n",
- values2[i].input, i, received, values2[i].expected, res);
- }
-}
+ /*
+ * Verify FE_INEXACT was raised or not,
+ * depending on whether there was rounding and
+ * whether the function is supposed to raise
+ * exceptions.
+ */
+ if (expect_except) {
+ ATF_CHECK_MSG(fetestexcept(FE_INEXACT) != 0,
+ "[%u] %s %s(%f)"
+ " failed to raise FE_INEXACT",
+ i, rmname(values[i].round_mode),
+ fnname[fn], values[i].input);
+ } else {
+ ATF_CHECK_MSG(fetestexcept(FE_INEXACT) == 0,
+ "[%u] %s %s(%f)"
+ " spuriously raised FE_INEXACT",
+ i, rmname(values[i].round_mode),
+ fnname[fn], values[i].input);
+ }
-ATF_TC(fe_nexttoward);
-ATF_TC_HEAD(fe_nexttoward, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Checking IEEE 754 rounding using nexttoward()");
-}
+ /*
+ * Verify the fractional part of the result is
+ * zero -- the result of rounding to an integer
+ * is supposed to be an integer.
+ */
+ fpart = modf(received, &ipart);
+ ATF_CHECK_MSG(fpart == 0,
+ "[%u] %s %s(%f)=%f has fractional part %f"
+ " (integer part %f)",
+ i, rmname(values[i].round_mode), fnname[fn],
+ values[i].input, received, fpart, ipart);
-ATF_TC_BODY(fe_nexttoward, tc)
-{
- double received;
- int res;
+ /*
+ * Assuming the result we got has zero
+ * fractional part, casting to long int should
+ * have no rounding. Verify it matches the
+ * integer we expect.
+ */
+ ATF_CHECK_MSG((long int)received == values[i].expected,
+ "[%u] %s %s(%f): got %f, expected %ld",
+ i, rmname(values[i].round_mode), fnname[fn],
+ values[i].input, received, values[i].expected);
- for (unsigned int i = 0; i < __arraycount(values2); i++) {
- received = nexttoward(values2[i].input, values2[i].toward);
- if (values2[i].input < values2[i].toward) {
- res = (received > values2[i].input);
- } else {
- res = (received < values2[i].input);
+ /* Do we get the same rounding mode out? */
+ ATF_CHECK_MSG(fegetround() == values[i].round_mode,
+ "[%u] %s: set %d (%s), got %d (%s)",
+ i, fnname[fn],
+ values[i].round_mode, rmname(values[i].round_mode),
+ fegetround(), rmname(fegetround()));
}
- ATF_CHECK_MSG(
- res && (fabs(received - values2[i].expected) < EPSILON),
- "nexttoward() rounding wrong, difference too large\n"
- "input: %f (index %d): got %f, expected %f, res %d\n",
- values2[i].input, i, received, values2[i].expected, res);
}
}
-ATF_TP_ADD_TCS(tp)
-{
-
- ATF_TP_ADD_TC(tp, fe_round);
- ATF_TP_ADD_TC(tp, fe_nearbyint);
- ATF_TP_ADD_TC(tp, fe_nextafter);
- ATF_TP_ADD_TC(tp, fe_nexttoward);
+#ifdef __HAVE_LONG_DOUBLE
- return atf_no_error();
-}
-#else
-ATF_TC(t_nofe_round);
+/*
+ * Use one bit more than fits in IEEE 754 binary64.
+ */
+static const struct {
+ int round_mode;
+ long double input;
+ int64_t expected;
+} valuesl[] = {
+ { FE_TOWARDZERO, 0x2.00000000000008p+52L, 0x20000000000000 },
+ { FE_DOWNWARD, 0x2.00000000000008p+52L, 0x20000000000000 },
+ { FE_UPWARD, 0x2.00000000000008p+52L, 0x20000000000001 },
+ { FE_TONEAREST, 0x2.00000000000008p+52L, 0x20000000000000 },
+ { FE_TOWARDZERO, 0x2.00000000000018p+52L, 0x20000000000001 },
+ { FE_DOWNWARD, 0x2.00000000000018p+52L, 0x20000000000001 },
+ { FE_UPWARD, 0x2.00000000000018p+52L, 0x20000000000002 },
+ { FE_TONEAREST, 0x2.00000000000018p+52L, 0x20000000000002 },
+};
-ATF_TC_HEAD(t_nofe_round, tc)
+ATF_TC(fe_nearbyintl_rintl);
+ATF_TC_HEAD(fe_nearbyintl_rintl, tc)
{
atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
+ "Checking IEEE 754 rounding modes using nearbyintl/rintl");
}
-ATF_TC_BODY(t_nofe_round, tc)
+ATF_TC_BODY(fe_nearbyintl_rintl, tc)
{
- atf_tc_skip("no fenv.h support on this architecture");
-}
+ enum {
+ RINTL,
+ NEARBYINTL,
+ N_FN,
+ } fn;
+ static const char *const fnname[] = {
+ [RINTL] = "rintl",
+ [NEARBYINTL] = "nearbyintl",
+ };
+ long double received, ipart, fpart;
+ unsigned i;
-ATF_TC(t_nofe_nearbyint);
+#ifdef __sparc64__
+ atf_tc_expect_fail("PR port-sparc64/59310:"
+ " t_fe_round:fe_nearbyint_rint tests are failing");
+#endif
-ATF_TC_HEAD(t_nofe_nearbyint, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
-}
+ for (i = 0; i < __arraycount(valuesl); i++) {
+ for (fn = 0; fn < N_FN; fn++) {
+ bool expect_except =
+ (valuesl[i].input !=
+ (long double)valuesl[i].expected);
-ATF_TC_BODY(t_nofe_nearbyint, tc)
-{
- atf_tc_skip("no fenv.h support on this architecture");
-}
+ /*
+ * Set the requested rounding mode.
+ */
+ fesetround(valuesl[i].round_mode);
-ATF_TC(t_nofe_nextafter);
+ /*
+ * Clear sticky floating-point exception bits
+ * so we can verify whether the FE_INEXACT
+ * exception is raised.
+ */
+ feclearexcept(FE_ALL_EXCEPT);
-ATF_TC_HEAD(t_nofe_nextafter, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
-}
+ /*
+ * Call the rint(3)-family function.
+ */
+ switch (fn) {
+ case NEARBYINTL:
+ received = nearbyintl(valuesl[i].input);
+ expect_except = false;
+ break;
+ case RINTL:
+ received = rintl(valuesl[i].input);
+ break;
+ default:
+ atf_tc_fail("impossible");
+ }
-ATF_TC_BODY(t_nofe_nextafter, tc)
-{
- atf_tc_skip("no fenv.h support on this architecture");
-}
+ /*
+ * Verify FE_INEXACT was raised or not,
+ * depending on whether there was rounding and
+ * whether the function is supposed to raise
+ * exceptions.
+ */
+ if (expect_except) {
+ ATF_CHECK_MSG(fetestexcept(FE_INEXACT) != 0,
+ "[%u] %s %s(%Lf)"
+ " failed to raise FE_INEXACT",
+ i, rmname(valuesl[i].round_mode),
+ fnname[fn], valuesl[i].input);
+ } else {
+ ATF_CHECK_MSG(fetestexcept(FE_INEXACT) == 0,
+ "[%u] %s %s(%Lf)"
+ " spuriously raised FE_INEXACT",
+ i, rmname(valuesl[i].round_mode),
+ fnname[fn], valuesl[i].input);
+ }
-ATF_TC(t_nofe_nexttoward);
+ /*
+ * Verify the fractional part of the result is
+ * zero -- the result of rounding to an integer
+ * is supposed to be an integer.
+ */
+ fpart = modfl(received, &ipart);
+ ATF_CHECK_MSG(fpart == 0,
+ "[%u] %s %s(%Lf)=%Lf has fractional part %Lf"
+ " (integer part %Lf)",
+ i, rmname(valuesl[i].round_mode), fnname[fn],
+ valuesl[i].input, received, fpart, ipart);
-ATF_TC_HEAD(t_nofe_nexttoward, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "dummy test case - no fenv.h support");
+ /*
+ * Assuming the result we got has zero
+ * fractional part, casting to int64_t should
+ * have no rounding. Verify it matches the
+ * integer we expect.
+ */
+ ATF_CHECK_MSG(((int64_t)received ==
+ valuesl[i].expected),
+ "[%u] %s %s(%Lf): got %Lf, expected %jd",
+ i, rmname(valuesl[i].round_mode), fnname[fn],
+ valuesl[i].input, received, valuesl[i].expected);
+
+ /* Do we get the same rounding mode out? */
+ ATF_CHECK_MSG(fegetround() == valuesl[i].round_mode,
+ "[%u] %s: set %d (%s), got %d (%s)",
+ i, fnname[fn],
+ valuesl[i].round_mode,
+ rmname(valuesl[i].round_mode),
+ fegetround(), rmname(fegetround()));
+ }
+ }
}
-ATF_TC_BODY(t_nofe_nexttoward, tc)
+#endif /* __HAVE_LONG_DOUBLE */
+
+ATF_TP_ADD_TCS(tp)
{
- atf_tc_skip("no fenv.h support on this architecture");
+
+ ATF_TP_ADD_TC(tp, fe_lrint);
+ ATF_TP_ADD_TC(tp, fe_nearbyint_rint);
+#ifdef __HAVE_LONG_DOUBLE
+ ATF_TP_ADD_TC(tp, fe_nearbyintl_rintl);
+#endif
+
+ return atf_no_error();
}
+#else /* !__HAVE_FENV */
+
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, t_nofe_round);
- ATF_TP_ADD_TC(tp, t_nofe_nearbyint);
- ATF_TP_ADD_TC(tp, t_nofe_nextafter);
- ATF_TP_ADD_TC(tp, t_nofe_nexttoward);
+
+ /*
+ * No fenv, no fesetround to test.
+ */
return atf_no_error();
}
-#endif
+#endif /* __HAVE_FENV */
diff --git a/lib/libm/t_fenv.c b/lib/libm/t_fenv.c
index 613bf3027950..402a55fe2f7b 100644
--- a/lib/libm/t_fenv.c
+++ b/lib/libm/t_fenv.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fenv.c,v 1.6 2019/04/25 20:48:54 kamil Exp $ */
+/* $NetBSD: t_fenv.c,v 1.18 2024/05/14 14:55:44 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,44 +29,143 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_fenv.c,v 1.6 2019/04/25 20:48:54 kamil Exp $");
+__RCSID("$NetBSD: t_fenv.c,v 1.18 2024/05/14 14:55:44 riastradh Exp $");
#include <atf-c.h>
#include <fenv.h>
#ifdef __HAVE_FENV
+/* XXXGCC gcc lacks #pragma STDC FENV_ACCESS */
+/* XXXclang clang lacks #pragma STDC FENV_ACCESS on some ports */
+#if !defined(__GNUC__)
+#pragma STDC FENV_ACCESS ON
+#endif
+
+#include <float.h>
#include <ieeefp.h>
#include <stdlib.h>
+#if FLT_RADIX != 2
+#error This test assumes binary floating-point arithmetic.
+#endif
#if (__arm__ && !__SOFTFP__) || __aarch64__
/*
- * Some NEON fpus do not trap on IEEE 754 FP exceptions.
+ * Some NEON fpus do not trap on IEEE 754 FP exceptions.
* Skip these tests if running on them and compiled for
* hard float.
*/
-#define FPU_EXC_PREREQ() \
- if (0 == fpsetmask(fpsetmask(FP_X_INV))) \
- atf_tc_skip("FPU does not implement traps on FP exceptions");
+#define FPU_EXC_PREREQ() do \
+{ \
+ if (0 == fpsetmask(fpsetmask(FP_X_INV))) \
+ atf_tc_skip("FPU does not implement traps on FP exceptions"); \
+} while (0)
/*
* Same as above: some don't allow configuring the rounding mode.
*/
-#define FPU_RND_PREREQ() \
- if (0 == fpsetround(fpsetround(FP_RZ))) \
- atf_tc_skip("FPU does not implement configurable " \
- "rounding modes");
+#define FPU_RND_PREREQ() do \
+{ \
+ if (0 == fpsetround(fpsetround(FP_RZ))) \
+ atf_tc_skip("FPU does not implement configurable " \
+ "rounding modes"); \
+} while (0)
+#endif
+
+#ifdef __riscv__
+#define FPU_EXC_PREREQ() \
+ atf_tc_skip("RISC-V does not support floating-point exception traps")
#endif
#ifndef FPU_EXC_PREREQ
-#define FPU_EXC_PREREQ() /* nothing */
+#define FPU_EXC_PREREQ() __nothing
#endif
#ifndef FPU_RND_PREREQ
-#define FPU_RND_PREREQ() /* nothing */
+#define FPU_RND_PREREQ() __nothing
#endif
+static int
+feround_to_fltrounds(int feround)
+{
+
+ /*
+ * C99, Sec. 5.2.4.2.2 Characteristics of floating types
+ * <float.h>, p. 24, clause 7
+ */
+ switch (feround) {
+ case FE_TOWARDZERO:
+ return 0;
+ case FE_TONEAREST:
+ return 1;
+ case FE_UPWARD:
+ return 2;
+ case FE_DOWNWARD:
+ return 3;
+ default:
+ return -1;
+ }
+}
+
+static void
+checkfltrounds(void)
+{
+ int feround = fegetround();
+ int expected = feround_to_fltrounds(feround);
+
+ ATF_CHECK_EQ_MSG(FLT_ROUNDS, expected,
+ "FLT_ROUNDS=%d expected=%d fegetround()=%d",
+ FLT_ROUNDS, expected, feround);
+}
+
+static void
+checkrounding(int feround, const char *name)
+{
+ volatile double ulp1 = DBL_EPSILON;
+
+ /*
+ * XXX These must be volatile to force rounding to double when
+ * the intermediate quantities are evaluated in long double
+ * precision, e.g. on 32-bit x86 with x87 long double. Under
+ * the C standard (C99, C11, C17, &c.), cast and assignment
+ * operators are required to remove all extra range and
+ * precision, i.e., round double to long double. But we build
+ * this code with -std=gnu99, which diverges from this
+ * requirement -- unless you add a volatile qualifier.
+ */
+ volatile double y1 = -1 + ulp1/4;
+ volatile double y2 = 1 + 3*(ulp1/2);
+
+ double z1, z2;
+
+ switch (feround) {
+ case FE_TONEAREST:
+ z1 = -1;
+ z2 = 1 + 2*ulp1;
+ break;
+ case FE_TOWARDZERO:
+ z1 = -1 + ulp1/2;
+ z2 = 1 + ulp1;
+ break;
+ case FE_UPWARD:
+ z1 = -1 + ulp1/2;
+ z2 = 1 + 2*ulp1;
+ break;
+ case FE_DOWNWARD:
+ z1 = -1;
+ z2 = 1 + ulp1;
+ break;
+ default:
+ atf_tc_fail("unknown rounding mode %d (%s)", feround, name);
+ }
+
+ ATF_CHECK_EQ_MSG(y1, z1, "%s[-1 + ulp(1)/4] expected=%a actual=%a",
+ name, y1, z1);
+ ATF_CHECK_EQ_MSG(y2, z2, "%s[1 + 3*(ulp(1)/2)] expected=%a actual=%a",
+ name, y2, z2);
+}
+
ATF_TC(fegetround);
ATF_TC_HEAD(fegetround, tc)
@@ -80,14 +179,35 @@ ATF_TC_BODY(fegetround, tc)
{
FPU_RND_PREREQ();
+ checkrounding(FE_TONEAREST, "FE_TONEAREST");
+
fpsetround(FP_RZ);
- ATF_CHECK(fegetround() == FE_TOWARDZERO);
+ ATF_CHECK_EQ_MSG(fegetround(), FE_TOWARDZERO,
+ "fegetround()=%d FE_TOWARDZERO=%d",
+ fegetround(), FE_TOWARDZERO);
+ checkfltrounds();
+ checkrounding(FE_TOWARDZERO, "FE_TOWARDZERO");
+
fpsetround(FP_RM);
- ATF_CHECK(fegetround() == FE_DOWNWARD);
+ ATF_CHECK_EQ_MSG(fegetround(), FE_DOWNWARD,
+ "fegetround()=%d FE_DOWNWARD=%d",
+ fegetround(), FE_DOWNWARD);
+ checkfltrounds();
+ checkrounding(FE_DOWNWARD, "FE_DOWNWARD");
+
fpsetround(FP_RN);
- ATF_CHECK(fegetround() == FE_TONEAREST);
+ ATF_CHECK_EQ_MSG(fegetround(), FE_TONEAREST,
+ "fegetround()=%d FE_TONEAREST=%d",
+ fegetround(), FE_TONEAREST);
+ checkfltrounds();
+ checkrounding(FE_TONEAREST, "FE_TONEAREST");
+
fpsetround(FP_RP);
- ATF_CHECK(fegetround() == FE_UPWARD);
+ ATF_CHECK_EQ_MSG(fegetround(), FE_UPWARD,
+ "fegetround()=%d FE_UPWARD=%d",
+ fegetround(), FE_UPWARD);
+ checkfltrounds();
+ checkrounding(FE_UPWARD, "FE_UPWARD");
}
ATF_TC(fesetround);
@@ -103,14 +223,35 @@ ATF_TC_BODY(fesetround, tc)
{
FPU_RND_PREREQ();
+ checkrounding(FE_TONEAREST, "FE_TONEAREST");
+
fesetround(FE_TOWARDZERO);
- ATF_CHECK(fpgetround() == FP_RZ);
+ ATF_CHECK_EQ_MSG(fpgetround(), FP_RZ,
+ "fpgetround()=%d FP_RZ=%d",
+ (int)fpgetround(), (int)FP_RZ);
+ checkfltrounds();
+ checkrounding(FE_TOWARDZERO, "FE_TOWARDZERO");
+
fesetround(FE_DOWNWARD);
- ATF_CHECK(fpgetround() == FP_RM);
+ ATF_CHECK_EQ_MSG(fpgetround(), FP_RM,
+ "fpgetround()=%d FP_RM=%d",
+ (int)fpgetround(), (int)FP_RM);
+ checkfltrounds();
+ checkrounding(FE_DOWNWARD, "FE_DOWNWARD");
+
fesetround(FE_TONEAREST);
- ATF_CHECK(fpgetround() == FP_RN);
+ ATF_CHECK_EQ_MSG(fpgetround(), FP_RN,
+ "fpgetround()=%d FP_RN=%d",
+ (int)fpgetround(), (int)FP_RN);
+ checkfltrounds();
+ checkrounding(FE_TONEAREST, "FE_TONEAREST");
+
fesetround(FE_UPWARD);
- ATF_CHECK(fpgetround() == FP_RP);
+ ATF_CHECK_EQ_MSG(fpgetround(), FP_RP,
+ "fpgetround()=%d FP_RP=%d",
+ (int)fpgetround(), (int)FP_RP);
+ checkfltrounds();
+ checkrounding(FE_UPWARD, "FE_UPWARD");
}
ATF_TC(fegetexcept);
@@ -127,26 +268,38 @@ ATF_TC_BODY(fegetexcept, tc)
FPU_EXC_PREREQ();
fpsetmask(0);
- ATF_CHECK(fegetexcept() == 0);
+ ATF_CHECK_EQ_MSG(fegetexcept(), 0,
+ "fegetexcept()=%d",
+ fegetexcept());
fpsetmask(FP_X_INV|FP_X_DZ|FP_X_OFL|FP_X_UFL|FP_X_IMP);
ATF_CHECK(fegetexcept() == (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW
|FE_UNDERFLOW|FE_INEXACT));
fpsetmask(FP_X_INV);
- ATF_CHECK(fegetexcept() == FE_INVALID);
+ ATF_CHECK_EQ_MSG(fegetexcept(), FE_INVALID,
+ "fegetexcept()=%d FE_INVALID=%d",
+ fegetexcept(), FE_INVALID);
fpsetmask(FP_X_DZ);
- ATF_CHECK(fegetexcept() == FE_DIVBYZERO);
+ ATF_CHECK_EQ_MSG(fegetexcept(), FE_DIVBYZERO,
+ "fegetexcept()=%d FE_DIVBYZERO=%d",
+ fegetexcept(), FE_DIVBYZERO);
fpsetmask(FP_X_OFL);
- ATF_CHECK(fegetexcept() == FE_OVERFLOW);
+ ATF_CHECK_EQ_MSG(fegetexcept(), FE_OVERFLOW,
+ "fegetexcept()=%d FE_OVERFLOW=%d",
+ fegetexcept(), FE_OVERFLOW);
fpsetmask(FP_X_UFL);
- ATF_CHECK(fegetexcept() == FE_UNDERFLOW);
+ ATF_CHECK_EQ_MSG(fegetexcept(), FE_UNDERFLOW,
+ "fegetexcept()=%d FE_UNDERFLOW=%d",
+ fegetexcept(), FE_UNDERFLOW);
fpsetmask(FP_X_IMP);
- ATF_CHECK(fegetexcept() == FE_INEXACT);
+ ATF_CHECK_EQ_MSG(fegetexcept(), FE_INEXACT,
+ "fegetexcept()=%d FE_INEXACT=%d",
+ fegetexcept(), FE_INEXACT);
}
ATF_TC(feenableexcept);
@@ -163,26 +316,78 @@ ATF_TC_BODY(feenableexcept, tc)
FPU_EXC_PREREQ();
fedisableexcept(FE_ALL_EXCEPT);
- ATF_CHECK(fpgetmask() == 0);
+ ATF_CHECK_EQ_MSG(fpgetmask(), 0,
+ "fpgetmask()=%d",
+ (int)fpgetmask());
feenableexcept(FE_UNDERFLOW);
- ATF_CHECK(fpgetmask() == FP_X_UFL);
+ ATF_CHECK_EQ_MSG(fpgetmask(), FP_X_UFL,
+ "fpgetmask()=%d FP_X_UFL=%d",
+ (int)fpgetmask(), (int)FP_X_UFL);
fedisableexcept(FE_ALL_EXCEPT);
feenableexcept(FE_OVERFLOW);
- ATF_CHECK(fpgetmask() == FP_X_OFL);
+ ATF_CHECK_EQ_MSG(fpgetmask(), FP_X_OFL,
+ "fpgetmask()=%d FP_X_OFL=%d",
+ (int)fpgetmask(), (int)FP_X_OFL);
fedisableexcept(FE_ALL_EXCEPT);
feenableexcept(FE_DIVBYZERO);
- ATF_CHECK(fpgetmask() == FP_X_DZ);
+ ATF_CHECK_EQ_MSG(fpgetmask(), FP_X_DZ,
+ "fpgetmask()=%d FP_X_DZ=%d",
+ (int)fpgetmask(), (int)FP_X_DZ);
fedisableexcept(FE_ALL_EXCEPT);
feenableexcept(FE_INEXACT);
- ATF_CHECK(fpgetmask() == FP_X_IMP);
+ ATF_CHECK_EQ_MSG(fpgetmask(), FP_X_IMP,
+ "fpgetmask()=%d FP_X_IMP=%d",
+ (int)fpgetmask(), (int)FP_X_IMP);
fedisableexcept(FE_ALL_EXCEPT);
feenableexcept(FE_INVALID);
- ATF_CHECK(fpgetmask() == FP_X_INV);
+ ATF_CHECK_EQ_MSG(fpgetmask(), FP_X_INV,
+ "fpgetmask()=%d FP_X_INV=%d",
+ (int)fpgetmask(), (int)FP_X_INV);
+}
+
+/*
+ * Temporary workaround for PR 58253: powerpc has more fenv exception
+ * bits than it can handle.
+ */
+#if defined __powerpc__
+#define FE_TRAP_EXCEPT \
+ (FE_DIVBYZERO|FE_INEXACT|FE_INVALID|FE_OVERFLOW|FE_UNDERFLOW)
+#else
+#define FE_TRAP_EXCEPT FE_ALL_EXCEPT
+#endif
+
+ATF_TC(fetestexcept_trap);
+ATF_TC_HEAD(fetestexcept_trap, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Verify fetestexcept doesn't affect the trapped excpetions");
+}
+ATF_TC_BODY(fetestexcept_trap, tc)
+{
+ int except;
+
+ FPU_EXC_PREREQ();
+
+ fedisableexcept(FE_TRAP_EXCEPT);
+ ATF_CHECK_EQ_MSG((except = fegetexcept()), 0,
+ "fegetexcept()=0x%x", except);
+
+ (void)fetestexcept(FE_TRAP_EXCEPT);
+ ATF_CHECK_EQ_MSG((except = fegetexcept()), 0,
+ "fegetexcept()=0x%x", except);
+
+ feenableexcept(FE_TRAP_EXCEPT);
+ ATF_CHECK_EQ_MSG((except = fegetexcept()), FE_TRAP_EXCEPT,
+ "fegetexcept()=0x%x FE_TRAP_EXCEPT=0x%x", except, FE_TRAP_EXCEPT);
+
+ (void)fetestexcept(FE_TRAP_EXCEPT);
+ ATF_CHECK_EQ_MSG((except = fegetexcept()), FE_TRAP_EXCEPT,
+ "fegetexcept()=0x%x FE_ALL_EXCEPT=0x%x", except, FE_TRAP_EXCEPT);
}
ATF_TP_ADD_TCS(tp)
@@ -191,6 +396,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, fesetround);
ATF_TP_ADD_TC(tp, fegetexcept);
ATF_TP_ADD_TC(tp, feenableexcept);
+ ATF_TP_ADD_TC(tp, fetestexcept_trap);
return atf_no_error();
}
diff --git a/lib/libm/t_hypot.c b/lib/libm/t_hypot.c
index 181b06b43059..fc04e774b799 100644
--- a/lib/libm/t_hypot.c
+++ b/lib/libm/t_hypot.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_hypot.c,v 1.2 2020/06/25 11:12:03 jruoho Exp $ */
+/* $NetBSD: t_hypot.c,v 1.9 2025/04/07 01:31:18 riastradh Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -27,33 +27,648 @@
*/
#include <atf-c.h>
+#include <float.h>
#include <math.h>
-ATF_TC(hypot_integer);
-ATF_TC_HEAD(hypot_integer, tc)
+#define CHECK_EQ(i, hypot, a, b, c) \
+ ATF_CHECK_MSG(hypot(a, b) == (c), \
+ "[%u] %s(%a, %a)=%a, expected %a", \
+ (i), #hypot, (a), (b), hypot(a, b), (c))
+
+#define CHECKL_EQ(i, hypot, a, b, c) \
+ ATF_CHECK_MSG(hypot(a, b) == (c), \
+ "[%u] %s(%La, %La)=%La, expected %La", \
+ (i), #hypot, (long double)(a), (long double)(b), hypot(a, b), \
+ (long double)(c))
+
+#define CHECK_NAN(i, hypot, a, b) \
+ ATF_CHECK_MSG(isnan(hypot(a, b)), \
+ "[%u] %s(%a, %a)=%a, expected NaN", \
+ (i), #hypot, (a), (b), hypot(a, b))
+
+#define CHECKL_NAN(i, hypot, a, b) \
+ ATF_CHECK_MSG(isnan(hypot(a, b)), \
+ "[%u] %s(%La, %La)=%La, expected NaN", \
+ (i), #hypot, (long double)(a), (long double)(b), hypot(a, b))
+
+static const float trivial_casesf[] = {
+ 0,
+#if __FLT_HAS_DENORM__
+ __FLT_DENORM_MIN__,
+ 2*__FLT_DENORM_MIN__,
+ 3*__FLT_DENORM_MIN__,
+ FLT_MIN - 3*__FLT_DENORM_MIN__,
+ FLT_MIN - 2*__FLT_DENORM_MIN__,
+ FLT_MIN - __FLT_DENORM_MIN__,
+#endif
+ FLT_MIN,
+ FLT_MIN*(1 + FLT_EPSILON),
+ FLT_MIN*(1 + 2*FLT_EPSILON),
+ 2*FLT_MIN,
+ FLT_EPSILON/2,
+ FLT_EPSILON,
+ 2*FLT_EPSILON,
+ 1 - 3*FLT_EPSILON/2,
+ 1 - 2*FLT_EPSILON/2,
+ 1 - FLT_EPSILON/2,
+ 1,
+ 1 + FLT_EPSILON,
+ 1 + 2*FLT_EPSILON,
+ 1 + 3*FLT_EPSILON,
+ 1.5 - 3*FLT_EPSILON,
+ 1.5 - 2*FLT_EPSILON,
+ 1.5 - FLT_EPSILON,
+ 1.5,
+ 1.5 + FLT_EPSILON,
+ 1.5 + 2*FLT_EPSILON,
+ 1.5 + 3*FLT_EPSILON,
+ 2,
+ 0.5/FLT_EPSILON - 0.5,
+ 0.5/FLT_EPSILON,
+ 0.5/FLT_EPSILON + 0.5,
+ 1/FLT_EPSILON,
+ FLT_MAX,
+ INFINITY,
+};
+
+static const double trivial_cases[] = {
+ 0,
+#if __DBL_HAS_DENORM__
+ __DBL_DENORM_MIN__,
+ 2*__DBL_DENORM_MIN__,
+ 3*__DBL_DENORM_MIN__,
+ DBL_MIN - 3*__DBL_DENORM_MIN__,
+ DBL_MIN - 2*__DBL_DENORM_MIN__,
+ DBL_MIN - __DBL_DENORM_MIN__,
+#endif
+ DBL_MIN,
+ DBL_MIN*(1 + DBL_EPSILON),
+ DBL_MIN*(1 + 2*DBL_EPSILON),
+ 2*DBL_MIN,
+ DBL_EPSILON/2,
+ DBL_EPSILON,
+ 2*DBL_EPSILON,
+ 1 - 3*DBL_EPSILON/2,
+ 1 - 2*DBL_EPSILON/2,
+ 1 - DBL_EPSILON/2,
+ 1,
+ 1 + DBL_EPSILON,
+ 1 + 2*DBL_EPSILON,
+ 1 + 3*DBL_EPSILON,
+ 1.5 - 3*DBL_EPSILON,
+ 1.5 - 2*DBL_EPSILON,
+ 1.5 - DBL_EPSILON,
+ 1.5,
+ 1.5 + DBL_EPSILON,
+ 1.5 + 2*DBL_EPSILON,
+ 1.5 + 3*DBL_EPSILON,
+ 2,
+ 1/FLT_EPSILON - 0.5,
+ 1/FLT_EPSILON,
+ 1/FLT_EPSILON + 0.5,
+ 0.5/DBL_EPSILON - 0.5,
+ 0.5/DBL_EPSILON,
+ 0.5/DBL_EPSILON + 0.5,
+ 1/DBL_EPSILON,
+ DBL_MAX,
+ INFINITY,
+};
+
+static const long double trivial_casesl[] = {
+ 0,
+#if __LDBL_HAS_DENORM__
+ __LDBL_DENORM_MIN__,
+ 2*__LDBL_DENORM_MIN__,
+ 3*__LDBL_DENORM_MIN__,
+ LDBL_MIN - 3*__LDBL_DENORM_MIN__,
+ LDBL_MIN - 2*__LDBL_DENORM_MIN__,
+ LDBL_MIN - __LDBL_DENORM_MIN__,
+#endif
+ LDBL_MIN,
+ LDBL_MIN*(1 + LDBL_EPSILON),
+ LDBL_MIN*(1 + 2*LDBL_EPSILON),
+ 2*LDBL_MIN,
+ LDBL_EPSILON/2,
+ LDBL_EPSILON,
+ 2*LDBL_EPSILON,
+ 1 - 3*LDBL_EPSILON/2,
+ 1 - 2*LDBL_EPSILON/2,
+ 1 - LDBL_EPSILON/2,
+ 1,
+ 1 + LDBL_EPSILON,
+ 1 + 2*LDBL_EPSILON,
+ 1 + 3*LDBL_EPSILON,
+ 1.5 - 3*LDBL_EPSILON,
+ 1.5 - 2*LDBL_EPSILON,
+ 1.5 - LDBL_EPSILON,
+ 1.5,
+ 1.5 + LDBL_EPSILON,
+ 1.5 + 2*LDBL_EPSILON,
+ 1.5 + 3*LDBL_EPSILON,
+ 2,
+ 1/FLT_EPSILON - 0.5,
+ 1/FLT_EPSILON,
+ 1/FLT_EPSILON + 0.5,
+#ifdef __HAVE_LONG_DOUBLE
+ 1/DBL_EPSILON - 0.5L,
+ 1/DBL_EPSILON,
+ 1/DBL_EPSILON + 0.5L,
+#endif
+ 0.5/LDBL_EPSILON - 0.5,
+ 0.5/LDBL_EPSILON,
+ 0.5/LDBL_EPSILON + 0.5,
+ 1/LDBL_EPSILON,
+ LDBL_MAX,
+ INFINITY,
+};
+
+ATF_TC(hypotf_trivial);
+ATF_TC_HEAD(hypotf_trivial, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test hypot with integer args");
+ atf_tc_set_md_var(tc, "descr", "hypotf(x,0) and hypotf(0,x)");
}
+ATF_TC_BODY(hypotf_trivial, tc)
+{
+ unsigned i;
+
+ for (i = 0; i < __arraycount(trivial_casesf); i++) {
+ volatile float x = trivial_casesf[i];
+
+ CHECK_EQ(i, hypotf, x, +0., x);
+ CHECK_EQ(i, hypotf, x, -0., x);
+ CHECK_EQ(i, hypotf, +0., x, x);
+ CHECK_EQ(i, hypotf, -0., x, x);
+ CHECK_EQ(i, hypotf, -x, +0., x);
+ CHECK_EQ(i, hypotf, -x, -0., x);
+ CHECK_EQ(i, hypotf, +0., -x, x);
+ CHECK_EQ(i, hypotf, -0., -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECK_EQ(i, hypotf, x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, +INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypotf, -INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypotf, -x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, -x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypotf, +INFINITY, -x, INFINITY);
+ CHECK_EQ(i, hypotf, -INFINITY, -x, INFINITY);
+ }
-ATF_TC_BODY(hypot_integer, tc)
+#ifdef NAN
+ if (isinf(x)) {
+ CHECK_EQ(i, hypotf, x, NAN, INFINITY);
+ CHECK_EQ(i, hypotf, NAN, x, INFINITY);
+ CHECK_EQ(i, hypotf, -x, NAN, INFINITY);
+ CHECK_EQ(i, hypotf, NAN, -x, INFINITY);
+ } else {
+ CHECK_NAN(i, hypotf, x, NAN);
+ CHECK_NAN(i, hypotf, NAN, x);
+ CHECK_NAN(i, hypotf, -x, NAN);
+ CHECK_NAN(i, hypotf, NAN, -x);
+ }
+#endif
+ }
+}
+
+ATF_TC(hypot_trivial);
+ATF_TC_HEAD(hypot_trivial, tc)
{
- /* volatile so hypotf() won't be evaluated at compile time */
- volatile double a = 5;
- volatile double b = 12;
- ATF_CHECK(hypot(a, b) == 13.0);
+ atf_tc_set_md_var(tc, "descr", "hypot(x,0) and hypot(0,x)");
}
+ATF_TC_BODY(hypot_trivial, tc)
+{
+ unsigned i;
+
+ for (i = 0; i < __arraycount(trivial_casesf); i++) {
+ volatile double x = trivial_casesf[i];
+
+ CHECK_EQ(i, hypot, x, +0., x);
+ CHECK_EQ(i, hypot, x, -0., x);
+ CHECK_EQ(i, hypot, +0., x, x);
+ CHECK_EQ(i, hypot, -0., x, x);
+ CHECK_EQ(i, hypot, -x, +0., x);
+ CHECK_EQ(i, hypot, -x, -0., x);
+ CHECK_EQ(i, hypot, +0., -x, x);
+ CHECK_EQ(i, hypot, -0., -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECK_EQ(i, hypot, x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, -x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, -x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECK_EQ(i, hypot, x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, -x, INFINITY);
+ } else {
+ CHECK_NAN(i, hypot, x, NAN);
+ CHECK_NAN(i, hypot, NAN, x);
+ CHECK_NAN(i, hypot, -x, NAN);
+ CHECK_NAN(i, hypot, NAN, -x);
+ }
+#endif
+ }
+
+ for (i = 0; i < __arraycount(trivial_cases); i++) {
+ volatile double x = trivial_cases[i];
+
+ CHECK_EQ(i, hypot, x, +0., x);
+ CHECK_EQ(i, hypot, x, -0., x);
+ CHECK_EQ(i, hypot, +0., x, x);
+ CHECK_EQ(i, hypot, -0., x, x);
+ CHECK_EQ(i, hypot, -x, +0., x);
+ CHECK_EQ(i, hypot, -x, -0., x);
+ CHECK_EQ(i, hypot, +0., -x, x);
+ CHECK_EQ(i, hypot, -0., -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECK_EQ(i, hypot, x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, +INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, -x, -INFINITY, INFINITY);
+ CHECK_EQ(i, hypot, +INFINITY, -x, INFINITY);
+ CHECK_EQ(i, hypot, -INFINITY, -x, INFINITY);
+ }
-ATF_TC(hypotf_integer);
-ATF_TC_HEAD(hypotf_integer, tc)
+#ifdef NAN
+ if (isinf(x)) {
+ CHECK_EQ(i, hypot, x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, x, INFINITY);
+ CHECK_EQ(i, hypot, -x, NAN, INFINITY);
+ CHECK_EQ(i, hypot, NAN, -x, INFINITY);
+ } else {
+ CHECK_NAN(i, hypot, x, NAN);
+ CHECK_NAN(i, hypot, NAN, x);
+ CHECK_NAN(i, hypot, -x, NAN);
+ CHECK_NAN(i, hypot, NAN, -x);
+ }
+#endif
+ }
+}
+
+ATF_TC(hypotl_trivial);
+ATF_TC_HEAD(hypotl_trivial, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test hypotf with integer args");
+ atf_tc_set_md_var(tc, "descr", "hypotl(x,0) and hypotl(0,x)");
+}
+ATF_TC_BODY(hypotl_trivial, tc)
+{
+ unsigned i;
+
+ for (i = 0; i < __arraycount(trivial_casesf); i++) {
+ volatile long double x = trivial_casesf[i];
+
+ CHECKL_EQ(i, hypotl, x, +0.L, x);
+ CHECKL_EQ(i, hypotl, x, -0.L, x);
+ CHECKL_EQ(i, hypotl, +0.L, x, x);
+ CHECKL_EQ(i, hypotl, -0.L, x, x);
+ CHECKL_EQ(i, hypotl, -x, +0.L, x);
+ CHECKL_EQ(i, hypotl, -x, -0.L, x);
+ CHECKL_EQ(i, hypotl, +0.L, -x, x);
+ CHECKL_EQ(i, hypotl, -0.L, -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
+ } else {
+ CHECKL_NAN(i, hypotl, x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, x);
+ CHECKL_NAN(i, hypotl, -x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, -x);
+ }
+#endif
+ }
+
+ for (i = 0; i < __arraycount(trivial_cases); i++) {
+ volatile long double x = trivial_cases[i];
+
+ CHECKL_EQ(i, hypotl, x, +0.L, x);
+ CHECKL_EQ(i, hypotl, x, -0.L, x);
+ CHECKL_EQ(i, hypotl, +0.L, x, x);
+ CHECKL_EQ(i, hypotl, -0.L, x, x);
+ CHECKL_EQ(i, hypotl, -x, +0.L, x);
+ CHECKL_EQ(i, hypotl, -x, -0.L, x);
+ CHECKL_EQ(i, hypotl, +0.L, -x, x);
+ CHECKL_EQ(i, hypotl, -0.L, -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
+ } else {
+ CHECKL_NAN(i, hypotl, x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, x);
+ CHECKL_NAN(i, hypotl, -x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, -x);
+ }
+#endif
+ }
+
+ for (i = 0; i < __arraycount(trivial_casesl); i++) {
+ volatile long double x = trivial_casesl[i];
+
+ CHECKL_EQ(i, hypotl, x, +0.L, x);
+ CHECKL_EQ(i, hypotl, x, -0.L, x);
+ CHECKL_EQ(i, hypotl, +0.L, x, x);
+ CHECKL_EQ(i, hypotl, -0.L, x, x);
+ CHECKL_EQ(i, hypotl, -x, +0.L, x);
+ CHECKL_EQ(i, hypotl, -x, -0.L, x);
+ CHECKL_EQ(i, hypotl, +0.L, -x, x);
+ CHECKL_EQ(i, hypotl, -0.L, -x, x);
+
+ if (isinf(INFINITY)) {
+ CHECKL_EQ(i, hypotl, x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, +INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, -INFINITY, INFINITY);
+ CHECKL_EQ(i, hypotl, +INFINITY, -x, INFINITY);
+ CHECKL_EQ(i, hypotl, -INFINITY, -x, INFINITY);
+ }
+
+#ifdef NAN
+ if (isinf(x)) {
+ CHECKL_EQ(i, hypotl, x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, x, INFINITY);
+ CHECKL_EQ(i, hypotl, -x, NAN, INFINITY);
+ CHECKL_EQ(i, hypotl, NAN, -x, INFINITY);
+ } else {
+ CHECKL_NAN(i, hypotl, x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, x);
+ CHECKL_NAN(i, hypotl, -x, NAN);
+ CHECKL_NAN(i, hypotl, NAN, -x);
+ }
+#endif
+ }
}
-ATF_TC_BODY(hypotf_integer, tc)
+/*
+ * All primitive Pythagorean triples are generated from coprime
+ * integers m > n > 0 by Euclid's formula,
+ *
+ * a = m^2 - n^2
+ * b = 2 m n,
+ * c = m^2 + n^2.
+ *
+ * We test cases with various different numbers and positions of bits,
+ * generated by this formula.
+ *
+ * If you're curious, you can recover m and n from a, b, and c by
+ *
+ * m = sqrt((a + c)/2)
+ * n = b/2m.
+ */
+
+__CTASSERT(FLT_MANT_DIG >= 24);
+static const struct {
+ float a, b, c;
+} exact_casesf[] = {
+ { 3, 4, 5 },
+ { 5, 12, 13 },
+ { 9, 12, 15 },
+ { 0x1001, 0x801000, 0x801001 },
+ { 4248257, 1130976, 4396225 },
+};
+
+__CTASSERT(DBL_MANT_DIG >= 53);
+static const struct {
+ double a, b, c;
+} exact_cases[] = {
+ { 3378249543467007, 4505248894795776, 5631148868747265 },
+ { 0x7ffffff, 0x1ffffff8000000, 0x1ffffff8000001 },
+#if DBL_MANT_DIG >= 56
+ { 13514123525517439, 18018830919909120, 22523538851237761 },
+ { 0x1fffffff, 0x1ffffffe0000000, 0x1ffffffe0000001 },
+#endif
+};
+
+#if LDBL_MANT_DIG >= 64
+static const struct {
+ long double a, b, c;
+} exact_casesl[] = {
+ { 3458976450080784639, 4611968592949214720, 5764960744407842561 },
+ { 0x200000000, 0x7ffffffffffffffe, 0x8000000000000002 },
+#if LDBL_MANT_DIG >= 113
+ { 973555668229277869436257492279295.L,
+ 1298074224305703705819019479072768.L,
+ 1622592780382129686316970078625793.L },
+ { 0x1ffffffffffffff,
+ 0x1fffffffffffffe00000000000000p0L,
+ 0x1fffffffffffffe00000000000001p0L },
+#endif
+};
+#endif
+
+ATF_TC(hypotf_exact);
+ATF_TC_HEAD(hypotf_exact, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "hypotf on scaled Pythagorean triples");
+}
+ATF_TC_BODY(hypotf_exact, tc)
+{
+ unsigned i;
+
+ for (i = 0; i < __arraycount(exact_casesf); i++) {
+ int s;
+
+ for (s = FLT_MIN_EXP;
+ s < FLT_MAX_EXP - FLT_MANT_DIG;
+ s += (FLT_MAX_EXP - FLT_MANT_DIG - FLT_MIN_EXP)/5) {
+ volatile double a = ldexpf(exact_casesf[i].a, s);
+ volatile double b = ldexpf(exact_casesf[i].b, s);
+ float c = ldexpf(exact_casesf[i].c, s);
+
+ CHECK_EQ(i, hypot, a, b, c);
+ CHECK_EQ(i, hypot, b, a, c);
+ CHECK_EQ(i, hypot, a, -b, c);
+ CHECK_EQ(i, hypot, b, -a, c);
+ CHECK_EQ(i, hypot, -a, b, c);
+ CHECK_EQ(i, hypot, -b, a, c);
+ CHECK_EQ(i, hypot, -a, -b, c);
+ CHECK_EQ(i, hypot, -b, -a, c);
+ }
+ }
+}
+
+ATF_TC(hypot_exact);
+ATF_TC_HEAD(hypot_exact, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "hypot on scaled Pythagorean triples");
+}
+ATF_TC_BODY(hypot_exact, tc)
+{
+ unsigned i;
+
+ for (i = 0; i < __arraycount(exact_casesf); i++) {
+ int s;
+
+ for (s = DBL_MIN_EXP;
+ s < DBL_MAX_EXP - DBL_MANT_DIG;
+ s += (DBL_MAX_EXP - DBL_MANT_DIG - DBL_MIN_EXP)/5) {
+ volatile double a = ldexp(exact_casesf[i].a, s);
+ volatile double b = ldexp(exact_casesf[i].b, s);
+ double c = ldexp(exact_casesf[i].c, s);
+
+ CHECK_EQ(i, hypot, a, b, c);
+ CHECK_EQ(i, hypot, b, a, c);
+ CHECK_EQ(i, hypot, a, -b, c);
+ CHECK_EQ(i, hypot, b, -a, c);
+ CHECK_EQ(i, hypot, -a, b, c);
+ CHECK_EQ(i, hypot, -b, a, c);
+ CHECK_EQ(i, hypot, -a, -b, c);
+ CHECK_EQ(i, hypot, -b, -a, c);
+ }
+ }
+
+ for (i = 0; i < __arraycount(exact_cases); i++) {
+ int s;
+
+ for (s = DBL_MIN_EXP;
+ s < DBL_MAX_EXP - DBL_MANT_DIG;
+ s += (DBL_MAX_EXP - DBL_MANT_DIG - DBL_MIN_EXP)/5) {
+ volatile double a = ldexp(exact_cases[i].a, s);
+ volatile double b = ldexp(exact_cases[i].b, s);
+ double c = ldexp(exact_cases[i].c, s);
+
+ CHECK_EQ(i, hypot, a, b, c);
+ CHECK_EQ(i, hypot, b, a, c);
+ CHECK_EQ(i, hypot, a, -b, c);
+ CHECK_EQ(i, hypot, b, -a, c);
+ CHECK_EQ(i, hypot, -a, b, c);
+ CHECK_EQ(i, hypot, -b, a, c);
+ CHECK_EQ(i, hypot, -a, -b, c);
+ CHECK_EQ(i, hypot, -b, -a, c);
+ }
+ }
+}
+
+ATF_TC(hypotl_exact);
+ATF_TC_HEAD(hypotl_exact, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "hypotl on scaled Pythagorean triples");
+}
+ATF_TC_BODY(hypotl_exact, tc)
+{
+ unsigned i;
+
+ for (i = 0; i < __arraycount(exact_casesf); i++) {
+ int s;
+
+ for (s = LDBL_MIN_EXP;
+ s < LDBL_MAX_EXP - LDBL_MANT_DIG;
+ s += (LDBL_MAX_EXP - LDBL_MANT_DIG - LDBL_MIN_EXP)/5) {
+ volatile long double a = ldexpl(exact_casesf[i].a, s);
+ volatile long double b = ldexpl(exact_casesf[i].b, s);
+ long double c = ldexpl(exact_casesf[i].c, s);
+
+ CHECKL_EQ(i, hypotl, a, b, c);
+ CHECKL_EQ(i, hypotl, b, a, c);
+ CHECKL_EQ(i, hypotl, a, -b, c);
+ CHECKL_EQ(i, hypotl, b, -a, c);
+ CHECKL_EQ(i, hypotl, -a, b, c);
+ CHECKL_EQ(i, hypotl, -b, a, c);
+ CHECKL_EQ(i, hypotl, -a, -b, c);
+ CHECKL_EQ(i, hypotl, -b, -a, c);
+ }
+ }
+
+ for (i = 0; i < __arraycount(exact_cases); i++) {
+ int s;
+
+ for (s = LDBL_MIN_EXP;
+ s < LDBL_MAX_EXP - LDBL_MANT_DIG;
+ s += (LDBL_MAX_EXP - LDBL_MANT_DIG - LDBL_MIN_EXP)/5) {
+ volatile long double a = ldexpl(exact_cases[i].a, s);
+ volatile long double b = ldexpl(exact_cases[i].b, s);
+ long double c = ldexpl(exact_cases[i].c, s);
+
+ CHECKL_EQ(i, hypotl, a, b, c);
+ CHECKL_EQ(i, hypotl, b, a, c);
+ CHECKL_EQ(i, hypotl, a, -b, c);
+ CHECKL_EQ(i, hypotl, b, -a, c);
+ CHECKL_EQ(i, hypotl, -a, b, c);
+ CHECKL_EQ(i, hypotl, -b, a, c);
+ CHECKL_EQ(i, hypotl, -a, -b, c);
+ CHECKL_EQ(i, hypotl, -b, -a, c);
+ }
+ }
+
+#if LDBL_MANT_DIG >= 64
+ for (i = 0; i < __arraycount(exact_casesl); i++) {
+ int s;
+
+ for (s = LDBL_MIN_EXP;
+ s < LDBL_MAX_EXP - LDBL_MANT_DIG;
+ s += (LDBL_MAX_EXP - LDBL_MANT_DIG - LDBL_MIN_EXP)/5) {
+ volatile long double a = ldexpl(exact_casesl[i].a, s);
+ volatile long double b = ldexpl(exact_casesl[i].b, s);
+ long double c = ldexpl(exact_casesl[i].c, s);
+
+ CHECKL_EQ(i, hypotl, a, b, c);
+ CHECKL_EQ(i, hypotl, b, a, c);
+ CHECKL_EQ(i, hypotl, a, -b, c);
+ CHECKL_EQ(i, hypotl, b, -a, c);
+ CHECKL_EQ(i, hypotl, -a, b, c);
+ CHECKL_EQ(i, hypotl, -b, a, c);
+ CHECKL_EQ(i, hypotl, -a, -b, c);
+ CHECKL_EQ(i, hypotl, -b, -a, c);
+ }
+ }
+#endif
+}
+
+ATF_TC(hypot_nan);
+ATF_TC_HEAD(hypot_nan, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "hypot/hypotf/hypotl(NAN, NAN)");
+}
+ATF_TC_BODY(hypot_nan, tc)
{
- volatile float a = 5;
- volatile float b = 12;
- ATF_CHECK(hypotf(a, b) == 13.0f);
+#ifdef NAN
+ CHECK_NAN(0, hypot, NAN, NAN);
+ CHECK_NAN(1, hypotf, NAN, NAN);
+ CHECKL_NAN(2, hypotl, NAN, NAN);
+#else
+ atf_tc_skip("no NaNs on this architecture");
+#endif
}
ATF_TC(pr50698);
@@ -73,8 +688,13 @@ ATF_TC_BODY(pr50698, tc)
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, hypot_integer);
- ATF_TP_ADD_TC(tp, hypotf_integer);
+ ATF_TP_ADD_TC(tp, hypot_exact);
+ ATF_TP_ADD_TC(tp, hypot_nan);
+ ATF_TP_ADD_TC(tp, hypot_trivial);
+ ATF_TP_ADD_TC(tp, hypotf_exact);
+ ATF_TP_ADD_TC(tp, hypotf_trivial);
+ ATF_TP_ADD_TC(tp, hypotl_exact);
+ ATF_TP_ADD_TC(tp, hypotl_trivial);
ATF_TP_ADD_TC(tp, pr50698);
return atf_no_error();
diff --git a/lib/libm/t_ilogb.c b/lib/libm/t_ilogb.c
index bbccaca39bc1..cd219011587f 100644
--- a/lib/libm/t_ilogb.c
+++ b/lib/libm/t_ilogb.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_ilogb.c,v 1.9 2018/06/14 21:57:25 maya Exp $ */
+/* $NetBSD: t_ilogb.c,v 1.11 2024/05/14 15:31:42 riastradh Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -28,8 +28,9 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
+
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_ilogb.c,v 1.9 2018/06/14 21:57:25 maya Exp $");
+__RCSID("$NetBSD: t_ilogb.c,v 1.11 2024/05/14 15:31:42 riastradh Exp $");
#include <atf-c.h>
#include <fenv.h>
@@ -38,89 +39,86 @@ __RCSID("$NetBSD: t_ilogb.c,v 1.9 2018/06/14 21:57:25 maya Exp $");
#ifndef __HAVE_FENV
-# define ATF_CHECK_RAISED_INVALID
-# define ATF_CHECK_RAISED_NOTHING
+# define ATF_CLEAR_EXCEPTS __nothing
+# define ATF_CHECK_RAISED_INVALID __nothing
+# define ATF_CHECK_RAISED_NOTHING __nothing
+
+#else /* __HAVE_FENV */
+
+# define ATF_CLEAR_EXCEPTS (void)feclearexcept(FE_ALL_EXCEPT);
-#else
# define ATF_CHECK_RAISED_INVALID do { \
int r = fetestexcept(FE_ALL_EXCEPT); \
ATF_CHECK_MSG((r & FE_INVALID) != 0, \
- "r & FE_INVALID == 0 (r=%#x, FE_INVALID=%#x)\n", \
+ "r & FE_INVALID == 0 (r=%#x, FE_INVALID=%#x)", \
r, FE_INVALID); \
(void)feclearexcept(FE_ALL_EXCEPT); \
} while (/*CONSTCOND*/0)
# define ATF_CHECK_RAISED_NOTHING do { \
int r = fetestexcept(FE_ALL_EXCEPT); \
- ATF_CHECK_MSG(r == 0, "r=%#x != 0\n", r); \
+ ATF_CHECK_MSG(r == 0, "r=%#x != 0", r); \
(void)feclearexcept(FE_ALL_EXCEPT); \
} while (/*CONSTCOND*/0)
-#endif
+
+#endif /* __HAVE_FENV */
ATF_TC(ilogb);
ATF_TC_HEAD(ilogb, tc)
{
- atf_tc_set_md_var(tc, "descr","Check ilogb family");
+ atf_tc_set_md_var(tc, "descr", "Check ilogb family");
}
ATF_TC_BODY(ilogb, tc)
{
+ ATF_CLEAR_EXCEPTS;
+
ATF_CHECK(ilogbf(0) == FP_ILOGB0);
ATF_CHECK_RAISED_INVALID;
ATF_CHECK(ilogb(0) == FP_ILOGB0);
ATF_CHECK_RAISED_INVALID;
-#ifdef __HAVE_LONG_DOUBLE
ATF_CHECK(ilogbl(0) == FP_ILOGB0);
ATF_CHECK_RAISED_INVALID;
-#endif
- ATF_CHECK(ilogbf(-0) == FP_ILOGB0);
+ ATF_CHECK(ilogbf(-0.) == FP_ILOGB0);
ATF_CHECK_RAISED_INVALID;
- ATF_CHECK(ilogb(-0) == FP_ILOGB0);
+ ATF_CHECK(ilogb(-0.) == FP_ILOGB0);
ATF_CHECK_RAISED_INVALID;
-#ifdef __HAVE_LONG_DOUBLE
- ATF_CHECK(ilogbl(-0) == FP_ILOGB0);
+ ATF_CHECK(ilogbl(-0.) == FP_ILOGB0);
ATF_CHECK_RAISED_INVALID;
-#endif
- ATF_CHECK(ilogbf(INFINITY) == INT_MAX);
- ATF_CHECK_RAISED_INVALID;
- ATF_CHECK(ilogb(INFINITY) == INT_MAX);
- ATF_CHECK_RAISED_INVALID;
-#ifdef __HAVE_LONG_DOUBLE
- ATF_CHECK(ilogbl(INFINITY) == INT_MAX);
- ATF_CHECK_RAISED_INVALID;
-#endif
+ if (isinf(INFINITY)) {
+ ATF_CHECK(ilogbf(INFINITY) == INT_MAX);
+ ATF_CHECK_RAISED_INVALID;
+ ATF_CHECK(ilogb(INFINITY) == INT_MAX);
+ ATF_CHECK_RAISED_INVALID;
+ ATF_CHECK(ilogbl(INFINITY) == INT_MAX);
+ ATF_CHECK_RAISED_INVALID;
- ATF_CHECK(ilogbf(-INFINITY) == INT_MAX);
- ATF_CHECK_RAISED_INVALID;
- ATF_CHECK(ilogb(-INFINITY) == INT_MAX);
- ATF_CHECK_RAISED_INVALID;
-#ifdef __HAVE_LONG_DOUBLE
- ATF_CHECK(ilogbl(-INFINITY) == INT_MAX);
- ATF_CHECK_RAISED_INVALID;
-#endif
+ ATF_CHECK(ilogbf(-INFINITY) == INT_MAX);
+ ATF_CHECK_RAISED_INVALID;
+ ATF_CHECK(ilogb(-INFINITY) == INT_MAX);
+ ATF_CHECK_RAISED_INVALID;
+ ATF_CHECK(ilogbl(-INFINITY) == INT_MAX);
+ ATF_CHECK_RAISED_INVALID;
+ }
ATF_CHECK(ilogbf(1024) == 10);
ATF_CHECK_RAISED_NOTHING;
ATF_CHECK(ilogb(1024) == 10);
ATF_CHECK_RAISED_NOTHING;
-#ifdef __HAVE_LONG_DOUBLE
ATF_CHECK(ilogbl(1024) == 10);
ATF_CHECK_RAISED_NOTHING;
-#endif
-#ifndef __vax__
+#ifdef NAN
ATF_CHECK(ilogbf(NAN) == FP_ILOGBNAN);
ATF_CHECK_RAISED_INVALID;
ATF_CHECK(ilogb(NAN) == FP_ILOGBNAN);
ATF_CHECK_RAISED_INVALID;
-#ifdef __HAVE_LONG_DOUBLE
ATF_CHECK(ilogbl(NAN) == FP_ILOGBNAN);
ATF_CHECK_RAISED_INVALID;
#endif
-#endif
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libm/t_infinity.c b/lib/libm/t_infinity.c
index 7ac17370799c..f27ae7f5bfcb 100644
--- a/lib/libm/t_infinity.c
+++ b/lib/libm/t_infinity.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_infinity.c,v 1.6 2012/09/26 07:24:38 jruoho Exp $ */
+/* $NetBSD: t_infinity.c,v 1.7 2024/05/09 14:00:58 riastradh Exp $ */
/*-
* Copyright (c) 2002, 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_infinity.c,v 1.6 2012/09/26 07:24:38 jruoho Exp $");
+__RCSID("$NetBSD: t_infinity.c,v 1.7 2024/05/09 14:00:58 riastradh Exp $");
#include <atf-c.h>
#include <math.h>
@@ -89,11 +89,6 @@ ATF_TC_HEAD(infinity_long_double, tc)
ATF_TC_BODY(infinity_long_double, tc)
{
-
-#ifndef LDBL_MAX
- atf_tc_skip("no long double support on this architecture");
- return;
-#else
long double v;
v = LDBL_MAX;
@@ -105,7 +100,6 @@ ATF_TC_BODY(infinity_long_double, tc)
v *= v;
ATF_REQUIRE(isinf(v));
ATF_REQUIRE(fpclassify(v) == FP_INFINITE);
-#endif
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libm/t_log.c b/lib/libm/t_log.c
index 41aae4c7c967..e4f6744cab7c 100644
--- a/lib/libm/t_log.c
+++ b/lib/libm/t_log.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_log.c,v 1.14 2018/11/07 03:59:36 riastradh Exp $ */
+/* $NetBSD: t_log.c,v 1.19 2024/07/17 14:52:13 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,846 +29,756 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_log.c,v 1.14 2018/11/07 03:59:36 riastradh Exp $");
+__RCSID("$NetBSD: t_log.c,v 1.19 2024/07/17 14:52:13 riastradh Exp $");
+
+#include <sys/types.h>
#include <atf-c.h>
+#include <errno.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
-/*
- * log10(3)
- */
-ATF_TC(log10_base);
-ATF_TC_HEAD(log10_base, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10(10) == 1");
-}
+#define CHECK_EQ(i, f, x, y) \
+ ATF_CHECK_EQ_MSG(f(x), y, \
+ "[%u] %s(%a=%.17g)=%a=%.17g, expected %a=%.17g", \
+ (i), #f, (double)(x), (double)(x), f(x), f(x), \
+ (double)(y), (double)(y))
-ATF_TC_BODY(log10_base, tc)
-{
- ATF_CHECK(log10(10.0) == 1.0);
-}
+#define CHECKL_EQ(i, f, x, y) \
+ ATF_CHECK_EQ_MSG(f(x), y, \
+ "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected %La=%.34Lg", \
+ (i), #f, (long double)(x), (long double)(x), f(x), f(x), \
+ (long double)(y), (long double)(y))
-ATF_TC(log10_nan);
-ATF_TC_HEAD(log10_nan, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10(NaN) == NaN");
-}
+#ifdef NAN
-ATF_TC_BODY(log10_nan, tc)
-{
- const double x = 0.0L / 0.0L;
+#define CHECK_NAN(i, f, x) \
+ ATF_CHECK_MSG(isnan(f(x)), \
+ "[%u] %s(%a=%.17g)=%a=%.17g, expected NaN", \
+ (i), #f, (x), (x), f(x), f(x))
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(log10(x)) != 0);
-}
-
-ATF_TC(log10_inf_neg);
-ATF_TC_HEAD(log10_inf_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10(-Inf) == NaN");
-}
+#define CHECKL_NAN(i, f, x) \
+ ATF_CHECK_MSG(isnan(f(x)), \
+ "[%u] %s(%La=%.34Lg)=%La=%.34Lg, expected NaN", \
+ (i), #f, (long double)(x), (long double)(x), f(x), f(x))
-ATF_TC_BODY(log10_inf_neg, tc)
-{
- const double x = -1.0L / 0.0L;
- const double y = log10(x);
+#else /* !defined(NAN) */
- ATF_CHECK(isnan(y) != 0);
-}
+#define CHECK_NAN(i, f, x) do \
+{ \
+ int _checknan_error; \
+ double _checknan_result; \
+ errno = 0; \
+ _checknan_result = f(x); \
+ _checknan_error = errno; \
+ ATF_CHECK_EQ_MSG(errno, EDOM, \
+ "[%u] %s(%a=%.17g)=%a=%.17g errno=%d, expected EDOM=%d", \
+ (i), #f, (double)(x), (double)(x), \
+ _checknan_result, _checknan_result, \
+ _checknan_error, EDOM); \
+} while (0)
-ATF_TC(log10_inf_pos);
-ATF_TC_HEAD(log10_inf_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10(+Inf) == +Inf");
-}
+#define CHECKL_NAN(i, f, x) do \
+{ \
+ int _checknan_error; \
+ long double _checknan_result; \
+ errno = 0; \
+ _checknan_result = f(x); \
+ _checknan_error = errno; \
+ ATF_CHECK_EQ_MSG(errno, EDOM, \
+ "[%u] %s(%La=%.34Lg)=%La=%.34Lg errno=%d, expected EDOM=%d", \
+ (i), #f, (long double)(x), (long double)(x), \
+ _checknan_result, _checknan_result, \
+ _checknan_error, EDOM); \
+} while (0)
-ATF_TC_BODY(log10_inf_pos, tc)
-{
- const double x = 1.0L / 0.0L;
+#endif /* NAN */
- ATF_CHECK(log10(x) == x);
-}
+static const float logf_invalid[] = {
+#ifdef NAN
+ NAN,
+#endif
+ -HUGE_VALF,
+ -FLT_MAX,
+ -10,
+ -1,
+ -FLT_EPSILON,
+ -FLT_MIN,
+#ifdef FLT_DENORM_MIN
+ -FLT_DENORM_MIN,
+#endif
+};
-ATF_TC(log10_one_pos);
-ATF_TC_HEAD(log10_one_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10(1.0) == +0.0");
-}
+static const double log_invalid[] = {
+#ifdef NAN
+ NAN,
+#endif
+ -HUGE_VAL,
+ -DBL_MAX,
+ -10,
+ -1,
+ -DBL_EPSILON,
+ -DBL_MIN,
+#ifdef DBL_DENORM_MIN
+ -DBL_DENORM_MIN,
+#endif
+};
-ATF_TC_BODY(log10_one_pos, tc)
-{
- const double x = log10(1.0);
- const double y = 0.0L;
+static const long double logl_invalid[] = {
+#ifdef NAN
+ NAN,
+#endif
+ -HUGE_VALL,
+ -LDBL_MAX,
+ -10,
+ -1,
+ -LDBL_EPSILON,
+ -LDBL_MIN,
+#ifdef LDBL_DENORM_MIN
+ -LDBL_DENORM_MIN,
+#endif
+};
- ATF_CHECK(x == y);
- ATF_CHECK(signbit(x) == 0);
- ATF_CHECK(signbit(y) == 0);
-}
+static const float log1pf_invalid[] = {
+#ifdef NAN
+ NAN,
+#endif
+ -HUGE_VALF,
+ -FLT_MAX,
+ -10,
+ -1 - FLT_EPSILON,
+};
-ATF_TC(log10_zero_neg);
-ATF_TC_HEAD(log10_zero_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10(-0.0) == -HUGE_VAL");
-}
+static const double log1p_invalid[] = {
+#ifdef NAN
+ NAN,
+#endif
+ -HUGE_VAL,
+ -DBL_MAX,
+ -10,
+ -1 - DBL_EPSILON,
+};
-ATF_TC_BODY(log10_zero_neg, tc)
-{
- const double x = -0.0L;
+static const long double log1pl_invalid[] = {
+#ifdef NAN
+ NAN,
+#endif
+ -HUGE_VALL,
+ -LDBL_MAX,
+ -10,
+ -1 - LDBL_EPSILON,
+};
- ATF_CHECK(log10(x) == -HUGE_VAL);
-}
+/*
+ * log10(3)
+ */
+static const struct {
+ float x, y;
+} log10f_exact[] = {
+ { 1, 0 },
+ { 10, 1 },
+ { 100, 2 },
+};
-ATF_TC(log10_zero_pos);
-ATF_TC_HEAD(log10_zero_pos, tc)
+ATF_TC(log10_invalid);
+ATF_TC_HEAD(log10_invalid, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log10(+0.0) == -HUGE_VAL");
+ atf_tc_set_md_var(tc, "descr", "Test log10/f/l on invalid inputs");
}
-
-ATF_TC_BODY(log10_zero_pos, tc)
+ATF_TC_BODY(log10_invalid, tc)
{
- const double x = 0.0L;
+ unsigned i;
- ATF_CHECK(log10(x) == -HUGE_VAL);
-}
+ for (i = 0; i < __arraycount(logf_invalid); i++) {
+ CHECK_NAN(i, log10f, logf_invalid[i]);
+ CHECK_NAN(i, log10, logf_invalid[i]);
+ CHECKL_NAN(i, log10l, logf_invalid[i]);
+ }
-/*
- * log10f(3)
- */
-ATF_TC(log10f_base);
-ATF_TC_HEAD(log10f_base, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10f(10) == 1");
-}
+ for (i = 0; i < __arraycount(log_invalid); i++) {
+ CHECK_NAN(i, log10, log_invalid[i]);
+ CHECKL_NAN(i, log10l, log_invalid[i]);
+ }
-ATF_TC_BODY(log10f_base, tc)
-{
- ATF_CHECK(log10f(10.0) == 1.0);
+ for (i = 0; i < __arraycount(logl_invalid); i++) {
+ CHECKL_NAN(i, log10l, logl_invalid[i]);
+ }
}
-ATF_TC(log10f_nan);
-ATF_TC_HEAD(log10f_nan, tc)
+ATF_TC(log10_zero);
+ATF_TC_HEAD(log10_zero, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log10f(NaN) == NaN");
+ atf_tc_set_md_var(tc, "descr", "Test log10/f/l on zero");
}
-
-ATF_TC_BODY(log10f_nan, tc)
+ATF_TC_BODY(log10_zero, tc)
{
- const float x = 0.0L / 0.0L;
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(log10f(x)) != 0);
-}
+ CHECK_EQ(0, log10f, +0., -HUGE_VALF);
+ CHECK_EQ(0, log10, +0., -HUGE_VAL);
+ CHECKL_EQ(0, log10l, +0., -HUGE_VALL);
-ATF_TC(log10f_inf_neg);
-ATF_TC_HEAD(log10f_inf_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10f(-Inf) == NaN");
+ CHECK_EQ(1, log10f, -0., -HUGE_VALF);
+ CHECK_EQ(1, log10, -0., -HUGE_VAL);
+ CHECKL_EQ(1, log10l, -0., -HUGE_VALL);
}
-ATF_TC_BODY(log10f_inf_neg, tc)
+ATF_TC(log10_exact);
+ATF_TC_HEAD(log10_exact, tc)
{
- const float x = -1.0L / 0.0L;
- const float y = log10f(x);
-
- ATF_CHECK(isnan(y) != 0);
+ atf_tc_set_md_var(tc, "descr", "Test log10/f/l exact cases");
}
-
-ATF_TC(log10f_inf_pos);
-ATF_TC_HEAD(log10f_inf_pos, tc)
+ATF_TC_BODY(log10_exact, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log10f(+Inf) == +Inf");
-}
+ unsigned i;
-ATF_TC_BODY(log10f_inf_pos, tc)
-{
- const float x = 1.0L / 0.0L;
+ ATF_CHECK_EQ(signbit(log10f(1)), 0);
+ ATF_CHECK_EQ(signbit(log10(1)), 0);
+ ATF_CHECK_EQ(signbit(log10l(1)), 0);
- ATF_CHECK(log10f(x) == x);
-}
+ for (i = 0; i < __arraycount(log10f_exact); i++) {
+ const float x = log10f_exact[i].x;
+ const float y = log10f_exact[i].y;
-ATF_TC(log10f_one_pos);
-ATF_TC_HEAD(log10f_one_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log10f(1.0) == +0.0");
+ CHECK_EQ(i, log10f, x, y);
+ CHECK_EQ(i, log10, x, y);
+ CHECKL_EQ(i, log10l, x, y);
+ }
}
-ATF_TC_BODY(log10f_one_pos, tc)
+ATF_TC(log10_approx);
+ATF_TC_HEAD(log10_approx, tc)
{
- const float x = log10f(1.0);
- const float y = 0.0L;
-
- ATF_CHECK(x == y);
- ATF_CHECK(signbit(x) == 0);
- ATF_CHECK(signbit(y) == 0);
+ atf_tc_set_md_var(tc, "descr", "Test log10/f/l approximate cases");
}
-
-ATF_TC(log10f_zero_neg);
-ATF_TC_HEAD(log10f_zero_neg, tc)
+ATF_TC_BODY(log10_approx, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log10f(-0.0) == -HUGE_VALF");
-}
+ volatile long double e =
+ 2.7182818284590452353602874713526624977572470937L;
+ volatile long double e2 =
+ 7.3890560989306502272304274605750078131803155705519L;
+ volatile long double log10e =
+ 0.43429448190325182765112891891660508229439700580367L;
+ volatile long double log10e2 =
+ 2*0.43429448190325182765112891891660508229439700580367L;
-ATF_TC_BODY(log10f_zero_neg, tc)
-{
- const float x = -0.0L;
+ ATF_CHECK_MSG((fabsf((log10f(e) - (float)log10e)/(float)log10e) <
+ 2*FLT_EPSILON),
+ "log10f(e)=%a=%.8g expected %a=%.8g",
+ log10f(e), log10f(e), (float)log10e, (float)log10e);
+ ATF_CHECK_MSG((fabs((log10(e) - (double)log10e)/(double)log10e) <
+ 2*DBL_EPSILON),
+ "log10(e)=%a=%.17g expected %a=%.17g",
+ log10(e), log10(e), (double)log10e, (double)log10e);
+ ATF_CHECK_MSG((fabsl((log10l(e) - log10e)/log10e) < 2*LDBL_EPSILON),
+ "log10l(e)=%La=%.34Lg expected %La=%.34Lg",
+ log10l(e), log10l(e), log10e, log10e);
- ATF_CHECK(log10f(x) == -HUGE_VALF);
+ ATF_CHECK_MSG((fabsf((log10f(e2) - (float)log10e2)/(float)log10e2) <
+ 2*FLT_EPSILON),
+ "log10f(e^2)=%a=%.8g expected %a=%.8g",
+ log10f(e2), log10f(e2), (float)log10e2, (float)log10e2);
+ ATF_CHECK_MSG((fabs((log10(e2) - (double)log10e2)/(double)log10e2) <
+ 2*DBL_EPSILON),
+ "log10(e^2)=%a=%.17g expected %a=%.17g",
+ log10(e2), log10(e2), (double)log10e2, (double)log10e2);
+ ATF_CHECK_MSG((fabsl((log10l(e2) - log10e2)/log10e2) < 2*LDBL_EPSILON),
+ "log10l(e^2)=%La=%.34Lg expected %La=%.34Lg",
+ log10l(e2), log10l(e2), log10e2, log10e2);
}
-ATF_TC(log10f_zero_pos);
-ATF_TC_HEAD(log10f_zero_pos, tc)
+ATF_TC(log10_inf);
+ATF_TC_HEAD(log10_inf, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log10f(+0.0) == -HUGE_VALF");
+ atf_tc_set_md_var(tc, "descr", "Test log10/f/l on +infinity");
}
-
-ATF_TC_BODY(log10f_zero_pos, tc)
+ATF_TC_BODY(log10_inf, tc)
{
- const float x = 0.0L;
- ATF_CHECK(log10f(x) == -HUGE_VALF);
+ if (!isinf(INFINITY))
+ atf_tc_skip("no infinities on this architecture");
+
+ CHECK_EQ(0, log10f, INFINITY, INFINITY);
+ CHECK_EQ(0, log10, INFINITY, INFINITY);
+ CHECKL_EQ(0, log10l, INFINITY, INFINITY);
}
/*
* log1p(3)
*/
-ATF_TC(log1p_nan);
-ATF_TC_HEAD(log1p_nan, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1p(NaN) == NaN");
-}
-ATF_TC_BODY(log1p_nan, tc)
+ATF_TC(log1p_invalid);
+ATF_TC_HEAD(log1p_invalid, tc)
{
- const double x = 0.0L / 0.0L;
-
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(log1p(x)) != 0);
-}
-
-ATF_TC(log1p_inf_neg);
-ATF_TC_HEAD(log1p_inf_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1p(-Inf) == NaN");
+ atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on invalid inputs");
}
-
-ATF_TC_BODY(log1p_inf_neg, tc)
+ATF_TC_BODY(log1p_invalid, tc)
{
- const double x = -1.0L / 0.0L;
- const double y = log1p(x);
+ unsigned i;
- if (isnan(y) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("log1p(-Inf) != NaN");
+ for (i = 0; i < __arraycount(log1pf_invalid); i++) {
+ CHECK_NAN(i, log1pf, log1pf_invalid[i]);
+ CHECK_NAN(i, log1p, log1pf_invalid[i]);
+ CHECKL_NAN(i, log1pl, log1pf_invalid[i]);
}
-}
-
-ATF_TC(log1p_inf_pos);
-ATF_TC_HEAD(log1p_inf_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1p(+Inf) == +Inf");
-}
-
-ATF_TC_BODY(log1p_inf_pos, tc)
-{
- const double x = 1.0L / 0.0L;
-
- ATF_CHECK(log1p(x) == x);
-}
-
-ATF_TC(log1p_one_neg);
-ATF_TC_HEAD(log1p_one_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1p(-1.0) == -HUGE_VAL");
-}
-ATF_TC_BODY(log1p_one_neg, tc)
-{
- const double x = log1p(-1.0);
+ for (i = 0; i < __arraycount(log1p_invalid); i++) {
+ CHECK_NAN(i, log1p, log1p_invalid[i]);
+ CHECKL_NAN(i, log1pl, log1p_invalid[i]);
+ }
- if (x != -HUGE_VAL) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("log1p(-1.0) != -HUGE_VAL");
+ for (i = 0; i < __arraycount(log1pl_invalid); i++) {
+ CHECKL_NAN(i, log1pl, log1pl_invalid[i]);
}
}
-ATF_TC(log1p_zero_neg);
-ATF_TC_HEAD(log1p_zero_neg, tc)
+ATF_TC(log1p_neg_one);
+ATF_TC_HEAD(log1p_neg_one, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log1p(-0.0) == -0.0");
+ atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on -1");
}
-
-ATF_TC_BODY(log1p_zero_neg, tc)
+ATF_TC_BODY(log1p_neg_one, tc)
{
- const double x = -0.0L;
- ATF_CHECK(log1p(x) == x);
+ CHECK_EQ(0, log1pf, -1., -HUGE_VALF);
+ CHECK_EQ(0, log1p, -1., -HUGE_VAL);
+ CHECKL_EQ(0, log1pl, -1., -HUGE_VALL);
}
-ATF_TC(log1p_zero_pos);
-ATF_TC_HEAD(log1p_zero_pos, tc)
+ATF_TC(log1p_exact);
+ATF_TC_HEAD(log1p_exact, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log1p(+0.0) == +0.0");
+ atf_tc_set_md_var(tc, "descr", "Test log1p/f/l exact cases");
}
-
-ATF_TC_BODY(log1p_zero_pos, tc)
+ATF_TC_BODY(log1p_exact, tc)
{
- const double x = 0.0L;
- ATF_CHECK(log1p(x) == x);
-}
+ CHECK_EQ(0, log1pf, -FLT_MIN, -FLT_MIN);
+ CHECK_EQ(0, log1p, -DBL_MIN, -DBL_MIN);
+ CHECKL_EQ(01, log1pl, -LDBL_MIN, -LDBL_MIN);
-/*
- * log1pf(3)
- */
-ATF_TC(log1pf_nan);
-ATF_TC_HEAD(log1pf_nan, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1pf(NaN) == NaN");
-}
+ CHECK_EQ(1, log1pf, -0., 0);
+ CHECK_EQ(1, log1p, -0., 0);
+ CHECKL_EQ(1, log1pl, -0., 0);
-ATF_TC_BODY(log1pf_nan, tc)
-{
- const float x = 0.0L / 0.0L;
+ CHECK_EQ(2, log1pf, +0., 0);
+ CHECK_EQ(2, log1p, +0., 0);
+ CHECKL_EQ(2, log1pl, +0., 0);
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(log1pf(x)) != 0);
+#ifdef __i386__
+ atf_tc_expect_fail("PR port-i386/58434: single-float functions"
+ " sometimes return surprisingly much precision");
+#endif
+ CHECK_EQ(3, log1pf, 1, logf(2));
+#ifdef __i386__
+ atf_tc_expect_pass();
+#endif
+ CHECK_EQ(3, log1p, 1, log(2));
+ CHECKL_EQ(3, log1pl, 1, logl(2));
}
-ATF_TC(log1pf_inf_neg);
-ATF_TC_HEAD(log1pf_inf_neg, tc)
+ATF_TC(log1p_approx);
+ATF_TC_HEAD(log1p_approx, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log1pf(-Inf) == NaN");
+ atf_tc_set_md_var(tc, "descr", "Test log1p/f/l approximate cases");
}
-
-ATF_TC_BODY(log1pf_inf_neg, tc)
+ATF_TC_BODY(log1p_approx, tc)
{
- const float x = -1.0L / 0.0L;
- const float y = log1pf(x);
+ volatile long double em1 = /* exp(1) - 1 */
+ 1.7182818284590452353602874713526624977572470937L;
+ volatile long double e2m1 = /* exp(2) - 1 */
+ 6.3890560989306502272304274605750078131803155705519L;
- if (isnan(y) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("log1pf(-Inf) != NaN");
- }
-}
+ /*
+ * Approximation is close enough that equality of the rounded
+ * output had better hold.
+ */
+#ifdef FLT_DENORM_MIN
+ CHECK_EQ(0, log1pf, -FLT_DENORM_MIN, -FLT_DENORM_MIN);
+#endif
+#ifdef DBL_DENORM_MIN
+ CHECK_EQ(0, log1p, -DBL_DENORM_MIN, -DBL_DENORM_MIN);
+#endif
+#ifdef LDBL_DENORM_MIN
+ CHECKL_EQ(0, log1pl, -LDBL_DENORM_MIN, -LDBL_DENORM_MIN);
+#endif
-ATF_TC(log1pf_inf_pos);
-ATF_TC_HEAD(log1pf_inf_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1pf(+Inf) == +Inf");
-}
-
-ATF_TC_BODY(log1pf_inf_pos, tc)
-{
- const float x = 1.0L / 0.0L;
+ ATF_CHECK_MSG(fabsf((log1pf(em1) - 1)/1) < 2*FLT_EPSILON,
+ "log1pf(e)=%a=%.8g", log1pf(em1), log1pf(em1));
+ ATF_CHECK_MSG(fabs((log1p(em1) - 1)/1) < 2*DBL_EPSILON,
+ "log1p(e)=%a=%.17g", log1p(em1), log1p(em1));
+ ATF_CHECK_MSG(fabsl((log1pl(em1) - 1)/1) < 2*LDBL_EPSILON,
+ "log1pl(e)=%La=%.34Lg", log1pl(em1), log1pl(em1));
- ATF_CHECK(log1pf(x) == x);
+ ATF_CHECK_MSG(fabsf((log1pf(e2m1) - 2)/2) < 2*FLT_EPSILON,
+ "log1pf(e^2)=%a=%.8g", log1pf(em1), log1pf(em1));
+ ATF_CHECK_MSG(fabs((log1p(e2m1) - 2)/2) < 2*DBL_EPSILON,
+ "log1p(e^2)=%a=%.17g", log1p(em1), log1p(em1));
+ ATF_CHECK_MSG(fabsl((log1pl(e2m1) - 2)/2) < 2*LDBL_EPSILON,
+ "log1pl(e^2)=%La=%.34Lg", log1pl(em1), log1pl(em1));
}
-ATF_TC(log1pf_one_neg);
-ATF_TC_HEAD(log1pf_one_neg, tc)
+ATF_TC(log1p_inf);
+ATF_TC_HEAD(log1p_inf, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log1pf(-1.0) == -HUGE_VALF");
+ atf_tc_set_md_var(tc, "descr", "Test log1p/f/l on +infinity");
}
-
-ATF_TC_BODY(log1pf_one_neg, tc)
+ATF_TC_BODY(log1p_inf, tc)
{
- const float x = log1pf(-1.0);
- if (x != -HUGE_VALF) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("log1pf(-1.0) != -HUGE_VALF");
- }
-}
+ if (!isinf(INFINITY))
+ atf_tc_skip("no infinities on this architecture");
-ATF_TC(log1pf_zero_neg);
-ATF_TC_HEAD(log1pf_zero_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1pf(-0.0) == -0.0");
-}
-
-ATF_TC_BODY(log1pf_zero_neg, tc)
-{
- const float x = -0.0L;
-
- ATF_CHECK(log1pf(x) == x);
-}
-
-ATF_TC(log1pf_zero_pos);
-ATF_TC_HEAD(log1pf_zero_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log1pf(+0.0) == +0.0");
-}
-
-ATF_TC_BODY(log1pf_zero_pos, tc)
-{
- const float x = 0.0L;
-
- ATF_CHECK(log1pf(x) == x);
+ CHECK_EQ(0, log1pf, INFINITY, INFINITY);
+ CHECK_EQ(0, log1p, INFINITY, INFINITY);
+ CHECKL_EQ(0, log1pl, INFINITY, INFINITY);
}
/*
* log2(3)
*/
-ATF_TC(log2_base);
-ATF_TC_HEAD(log2_base, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2(2) == 1");
-}
-
-ATF_TC_BODY(log2_base, tc)
-{
- ATF_CHECK(log2(2.0) == 1.0);
-}
+static const struct {
+ float x, y;
+} log2f_exact[] = {
+#ifdef FLT_DENORM_MIN
+ { FLT_DENORM_MIN, FLT_MIN_EXP - FLT_MANT_DIG },
+#endif
+ { FLT_MIN, FLT_MIN_EXP - 1 },
+ { 0.25, -2 },
+ { 0.5, -1 },
+ { 1, 0 },
+ { 2, 1 },
+ { 4, 2 },
+ { 8, 3 },
+ { 1 << FLT_MANT_DIG, FLT_MANT_DIG },
+ { (float)(1 << FLT_MANT_DIG) * (1 << FLT_MANT_DIG),
+ 2*FLT_MANT_DIG },
+};
+static const struct {
+ double x, y;
+} log2_exact[] = {
+#ifdef DBL_DENORM_MIN
+ { DBL_DENORM_MIN, DBL_MIN_EXP - DBL_MANT_DIG },
+#endif
+ { DBL_MIN, DBL_MIN_EXP - 1 },
+ { (uint64_t)1 << DBL_MANT_DIG, DBL_MANT_DIG },
+ { ((double)((uint64_t)1 << DBL_MANT_DIG) *
+ ((uint64_t)1 << DBL_MANT_DIG)),
+ 2*DBL_MANT_DIG },
+};
-ATF_TC(log2_nan);
-ATF_TC_HEAD(log2_nan, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2(NaN) == NaN");
-}
+static const struct {
+ long double x, y;
+} log2l_exact[] = {
+#ifdef LDBL_DENORM_MIN
+ { LDBL_DENORM_MIN, LDBL_MIN_EXP - LDBL_MANT_DIG },
+#endif
+ { LDBL_MIN, LDBL_MIN_EXP - 1 },
+ { ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
+ ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))),
+ LDBL_MANT_DIG },
+ { (((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
+ ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2))) *
+ ((long double)((uint64_t)1 << (LDBL_MANT_DIG/2)) *
+ ((uint64_t)1 << ((LDBL_MANT_DIG + 1)/2)))),
+ 2*LDBL_MANT_DIG },
+};
-ATF_TC_BODY(log2_nan, tc)
+ATF_TC(log2_invalid);
+ATF_TC_HEAD(log2_invalid, tc)
{
- const double x = 0.0L / 0.0L;
-
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(log2(x)) != 0);
+ atf_tc_set_md_var(tc, "descr", "Test log2/f/l on invalid inputs");
}
-
-ATF_TC(log2_inf_neg);
-ATF_TC_HEAD(log2_inf_neg, tc)
+ATF_TC_BODY(log2_invalid, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log2(-Inf) == NaN");
-}
+ unsigned i;
-ATF_TC_BODY(log2_inf_neg, tc)
-{
- const double x = -1.0L / 0.0L;
- const double y = log2(x);
-
- ATF_CHECK(isnan(y) != 0);
-}
-
-ATF_TC(log2_inf_pos);
-ATF_TC_HEAD(log2_inf_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2(+Inf) == +Inf");
-}
-
-ATF_TC_BODY(log2_inf_pos, tc)
-{
- const double x = 1.0L / 0.0L;
-
- ATF_CHECK(log2(x) == x);
-}
-
-ATF_TC(log2_one_pos);
-ATF_TC_HEAD(log2_one_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2(1.0) == +0.0");
-}
-
-ATF_TC_BODY(log2_one_pos, tc)
-{
- const double x = log2(1.0);
- const double y = 0.0L;
+ for (i = 0; i < __arraycount(logf_invalid); i++) {
+ CHECK_NAN(i, log2f, logf_invalid[i]);
+ CHECK_NAN(i, log2, logf_invalid[i]);
+ CHECKL_NAN(i, log2l, logf_invalid[i]);
+ }
- ATF_CHECK(x == y);
- ATF_CHECK(signbit(x) == 0);
- ATF_CHECK(signbit(y) == 0);
-}
+ for (i = 0; i < __arraycount(log_invalid); i++) {
+ CHECK_NAN(i, log2, log_invalid[i]);
+ CHECKL_NAN(i, log2l, log_invalid[i]);
+ }
-ATF_TC(log2_zero_neg);
-ATF_TC_HEAD(log2_zero_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2(-0.0) == -HUGE_VAL");
+ for (i = 0; i < __arraycount(logl_invalid); i++) {
+ CHECKL_NAN(i, log2l, logl_invalid[i]);
+ }
}
-ATF_TC_BODY(log2_zero_neg, tc)
+ATF_TC(log2_zero);
+ATF_TC_HEAD(log2_zero, tc)
{
- const double x = -0.0L;
-
- ATF_CHECK(log2(x) == -HUGE_VAL);
+ atf_tc_set_md_var(tc, "descr", "Test log2/f/l on zero");
}
-
-ATF_TC(log2_zero_pos);
-ATF_TC_HEAD(log2_zero_pos, tc)
+ATF_TC_BODY(log2_zero, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log2(+0.0) == -HUGE_VAL");
-}
-ATF_TC_BODY(log2_zero_pos, tc)
-{
- const double x = 0.0L;
+ CHECK_EQ(0, log2f, +0., -HUGE_VALF);
+ CHECK_EQ(0, log2, +0., -HUGE_VAL);
+ CHECKL_EQ(0, log2l, +0., -HUGE_VALL);
- ATF_CHECK(log2(x) == -HUGE_VAL);
+ CHECK_EQ(1, log2f, -0., -HUGE_VALF);
+ CHECK_EQ(1, log2, -0., -HUGE_VAL);
+ CHECKL_EQ(1, log2l, -0., -HUGE_VALL);
}
-/*
- * log2f(3)
- */
-ATF_TC(log2f_base);
-ATF_TC_HEAD(log2f_base, tc)
+ATF_TC(log2_exact);
+ATF_TC_HEAD(log2_exact, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log2f(2) == 1");
+ atf_tc_set_md_var(tc, "descr", "Test log2/f/l exact cases");
}
-
-ATF_TC_BODY(log2f_base, tc)
+ATF_TC_BODY(log2_exact, tc)
{
- ATF_CHECK(log2f(2.0) == 1.0);
-}
+ unsigned i;
-ATF_TC(log2f_nan);
-ATF_TC_HEAD(log2f_nan, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2f(NaN) == NaN");
-}
+ ATF_CHECK_EQ(signbit(log2f(1)), 0);
+ ATF_CHECK_EQ(signbit(log2(1)), 0);
+ ATF_CHECK_EQ(signbit(log2l(1)), 0);
-ATF_TC_BODY(log2f_nan, tc)
-{
- const float x = 0.0L / 0.0L;
+ for (i = 0; i < __arraycount(log2f_exact); i++) {
+ const float x = log2f_exact[i].x;
+ const float y = log2f_exact[i].y;
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(log2f(x)) != 0);
-}
+ CHECK_EQ(i, log2f, x, y);
+ CHECK_EQ(i, log2, x, y);
+ CHECKL_EQ(i, log2l, x, y);
+ }
-ATF_TC(log2f_inf_neg);
-ATF_TC_HEAD(log2f_inf_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2f(-Inf) == NaN");
-}
+ for (i = 0; i < __arraycount(log2_exact); i++) {
+ const double x = log2_exact[i].x;
+ const double y = log2_exact[i].y;
-ATF_TC_BODY(log2f_inf_neg, tc)
-{
- const float x = -1.0L / 0.0L;
- const float y = log2f(x);
+ CHECK_EQ(i, log2, x, y);
+ CHECKL_EQ(i, log2l, x, y);
+ }
- ATF_CHECK(isnan(y) != 0);
-}
+ for (i = 0; i < __arraycount(log2l_exact); i++) {
+ const long double x = log2l_exact[i].x;
+ const long double y = log2l_exact[i].y;
-ATF_TC(log2f_inf_pos);
-ATF_TC_HEAD(log2f_inf_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2f(+Inf) == +Inf");
+ CHECKL_EQ(i, log2l, x, y);
+ }
}
-ATF_TC_BODY(log2f_inf_pos, tc)
+ATF_TC(log2_approx);
+ATF_TC_HEAD(log2_approx, tc)
{
- const float x = 1.0L / 0.0L;
-
- ATF_CHECK(log2f(x) == x);
+ atf_tc_set_md_var(tc, "descr", "Test log2/f/l approximate cases");
}
-
-ATF_TC(log2f_one_pos);
-ATF_TC_HEAD(log2f_one_pos, tc)
+ATF_TC_BODY(log2_approx, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log2f(1.0) == +0.0");
-}
+ volatile long double e =
+ 2.7182818284590452353602874713526624977572470937L;
+ volatile long double e2 =
+ 7.3890560989306502272304274605750078131803155705519L;
+ volatile long double log2e =
+ 1.442695040888963407359924681001892137426645954153L;
+ volatile long double log2e2 =
+ 2*1.442695040888963407359924681001892137426645954153L;
-ATF_TC_BODY(log2f_one_pos, tc)
-{
- const float x = log2f(1.0);
- const float y = 0.0L;
+ ATF_CHECK_MSG((fabsf((log2f(e) - (float)log2e)/(float)log2e) <
+ 2*FLT_EPSILON),
+ "log2f(e)=%a=%.8g expected %a=%.8g",
+ log2f(e), log2f(e), (float)log2e, (float)log2e);
+ ATF_CHECK_MSG((fabs((log2(e) - (double)log2e)/(double)log2e) <
+ 2*DBL_EPSILON),
+ "log2(e)=%a=%.17g expected %a=%.17g",
+ log2(e), log2(e), (double)log2e, (double)log2e);
+ ATF_CHECK_MSG((fabsl((log2l(e) - log2e)/log2e) < 2*LDBL_EPSILON),
+ "log2l(e)=%La=%.34Lg expected %La=%.34Lg",
+ log2l(e), log2l(e), log2e, log2e);
- ATF_CHECK(x == y);
- ATF_CHECK(signbit(x) == 0);
- ATF_CHECK(signbit(y) == 0);
+ ATF_CHECK_MSG((fabsf((log2f(e2) - (float)log2e2)/(float)log2e2) <
+ 2*FLT_EPSILON),
+ "log2f(e^2)=%a=%.8g expected %a=%.8g",
+ log2f(e2), log2f(e2), (float)log2e2, (float)log2e2);
+ ATF_CHECK_MSG((fabs((log2(e2) - (double)log2e2)/(double)log2e2) <
+ 2*DBL_EPSILON),
+ "log2(e^2)=%a=%.17g expected %a=%.17g",
+ log2(e2), log2(e2), (double)log2e2, (double)log2e2);
+ ATF_CHECK_MSG((fabsl((log2l(e2) - log2e2)/log2e2) < 2*LDBL_EPSILON),
+ "log2l(e^2)=%La=%.34Lg expected %La=%.34Lg",
+ log2l(e2), log2l(e2), log2e2, log2e2);
}
-ATF_TC(log2f_zero_neg);
-ATF_TC_HEAD(log2f_zero_neg, tc)
+ATF_TC(log2_inf);
+ATF_TC_HEAD(log2_inf, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test log2f(-0.0) == -HUGE_VALF");
+ atf_tc_set_md_var(tc, "descr", "Test log2/f/l on +infinity");
}
-
-ATF_TC_BODY(log2f_zero_neg, tc)
+ATF_TC_BODY(log2_inf, tc)
{
- const float x = -0.0L;
- ATF_CHECK(log2f(x) == -HUGE_VALF);
-}
+ if (!isinf(INFINITY))
+ atf_tc_skip("no infinities on this architecture");
-ATF_TC(log2f_zero_pos);
-ATF_TC_HEAD(log2f_zero_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log2f(+0.0) == -HUGE_VALF");
-}
-
-ATF_TC_BODY(log2f_zero_pos, tc)
-{
- const float x = 0.0L;
-
- ATF_CHECK(log2f(x) == -HUGE_VALF);
+ CHECK_EQ(0, log2f, INFINITY, INFINITY);
+ CHECK_EQ(0, log2, INFINITY, INFINITY);
+ CHECKL_EQ(0, log2l, INFINITY, INFINITY);
}
/*
* log(3)
*/
-ATF_TC(log_base);
-ATF_TC_HEAD(log_base, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log(e) == 1");
-}
-
-ATF_TC_BODY(log_base, tc)
-{
- const double eps = DBL_EPSILON;
-
- if (!(fabs(log(M_E) - 1.0) <= eps))
- atf_tc_fail_nonfatal("log(e) = %.17g != 1", log(M_E));
-}
-
-ATF_TC(log_nan);
-ATF_TC_HEAD(log_nan, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log(NaN) == NaN");
-}
-ATF_TC_BODY(log_nan, tc)
+ATF_TC(log_invalid);
+ATF_TC_HEAD(log_invalid, tc)
{
- const double x = 0.0L / 0.0L;
-
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(log(x)) != 0);
-}
-
-ATF_TC(log_inf_neg);
-ATF_TC_HEAD(log_inf_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log(-Inf) == NaN");
-}
-
-ATF_TC_BODY(log_inf_neg, tc)
-{
- const double x = -1.0L / 0.0L;
- const double y = log(x);
-
- ATF_CHECK(isnan(y) != 0);
-}
-
-ATF_TC(log_inf_pos);
-ATF_TC_HEAD(log_inf_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log(+Inf) == +Inf");
-}
-
-ATF_TC_BODY(log_inf_pos, tc)
-{
- const double x = 1.0L / 0.0L;
-
- ATF_CHECK(log(x) == x);
+ atf_tc_set_md_var(tc, "descr", "Test log/f/l on invalid inputs");
}
-
-ATF_TC(log_one_pos);
-ATF_TC_HEAD(log_one_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log(1.0) == +0.0");
-}
-
-ATF_TC_BODY(log_one_pos, tc)
+ATF_TC_BODY(log_invalid, tc)
{
- const double x = log(1.0);
- const double y = 0.0L;
+ unsigned i;
- ATF_CHECK(x == y);
- ATF_CHECK(signbit(x) == 0);
- ATF_CHECK(signbit(y) == 0);
-}
-
-ATF_TC(log_zero_neg);
-ATF_TC_HEAD(log_zero_neg, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log(-0.0) == -HUGE_VAL");
-}
-
-ATF_TC_BODY(log_zero_neg, tc)
-{
- const double x = -0.0L;
-
- ATF_CHECK(log(x) == -HUGE_VAL);
-}
-
-ATF_TC(log_zero_pos);
-ATF_TC_HEAD(log_zero_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test log(+0.0) == -HUGE_VAL");
-}
+ for (i = 0; i < __arraycount(logf_invalid); i++) {
+ CHECK_NAN(i, logf, logf_invalid[i]);
+ CHECK_NAN(i, log, logf_invalid[i]);
+ CHECKL_NAN(i, logl, logf_invalid[i]);
+ }
-ATF_TC_BODY(log_zero_pos, tc)
-{
- const double x = 0.0L;
+ for (i = 0; i < __arraycount(log_invalid); i++) {
+ CHECK_NAN(i, log, log_invalid[i]);
+ CHECKL_NAN(i, logl, log_invalid[i]);
+ }
- ATF_CHECK(log(x) == -HUGE_VAL);
+ for (i = 0; i < __arraycount(logl_invalid); i++) {
+ CHECKL_NAN(i, logl, logl_invalid[i]);
+ }
}
-/*
- * logf(3)
- */
-ATF_TC(logf_base);
-ATF_TC_HEAD(logf_base, tc)
+ATF_TC(log_zero);
+ATF_TC_HEAD(log_zero, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test logf(e) == 1");
+ atf_tc_set_md_var(tc, "descr", "Test log/f/l on zero");
}
-
-ATF_TC_BODY(logf_base, tc)
+ATF_TC_BODY(log_zero, tc)
{
- const float eps = FLT_EPSILON;
- if (!(fabsf(logf(M_E) - 1.0f) <= eps))
- atf_tc_fail_nonfatal("logf(e) = %.17g != 1",
- (double)logf(M_E));
-}
+ CHECK_EQ(0, logf, +0., -HUGE_VALF);
+ CHECK_EQ(0, log, +0., -HUGE_VAL);
+ CHECKL_EQ(0, logl, +0., -HUGE_VALL);
-ATF_TC(logf_nan);
-ATF_TC_HEAD(logf_nan, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test logf(NaN) == NaN");
+ CHECK_EQ(1, logf, -0., -HUGE_VALF);
+ CHECK_EQ(1, log, -0., -HUGE_VAL);
+ CHECKL_EQ(1, logl, -0., -HUGE_VALL);
}
-ATF_TC_BODY(logf_nan, tc)
+ATF_TC(log_exact);
+ATF_TC_HEAD(log_exact, tc)
{
- const float x = 0.0L / 0.0L;
-
- ATF_CHECK(isnan(x) != 0);
- ATF_CHECK(isnan(logf(x)) != 0);
+ atf_tc_set_md_var(tc, "descr", "Test log/f/l exact cases");
}
-
-ATF_TC(logf_inf_neg);
-ATF_TC_HEAD(logf_inf_neg, tc)
+ATF_TC_BODY(log_exact, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test logf(-Inf) == NaN");
-}
-ATF_TC_BODY(logf_inf_neg, tc)
-{
- const float x = -1.0L / 0.0L;
- const float y = logf(x);
+ CHECK_EQ(0, logf, 1, 0);
+ CHECK_EQ(0, log, 1, 0);
+ CHECKL_EQ(0, logl, 1, 0);
- ATF_CHECK(isnan(y) != 0);
+ ATF_CHECK_EQ(signbit(logf(1)), 0);
+ ATF_CHECK_EQ(signbit(log(1)), 0);
+ ATF_CHECK_EQ(signbit(logl(1)), 0);
}
-ATF_TC(logf_inf_pos);
-ATF_TC_HEAD(logf_inf_pos, tc)
+ATF_TC(log_approx);
+ATF_TC_HEAD(log_approx, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test logf(+Inf) == +Inf");
+ atf_tc_set_md_var(tc, "descr", "Test log/f/l approximate cases");
}
-
-ATF_TC_BODY(logf_inf_pos, tc)
+ATF_TC_BODY(log_approx, tc)
{
- const float x = 1.0L / 0.0L;
+ volatile long double e =
+ 2.7182818284590452353602874713526624977572470937L;
+ volatile long double e2 =
+ 7.3890560989306502272304274605750078131803155705519L;
+ volatile long double log_2 =
+ 0.69314718055994530941723212145817656807550013436025L;
+ volatile long double log_10 =
+ 2.30258509299404568401799145468436420760110148862875L;
- ATF_CHECK(logf(x) == x);
-}
+ ATF_CHECK_MSG(fabsf((logf(2) - log_2)/log_2) < 2*FLT_EPSILON,
+ "logf(2)=%a=%.8g expected %a=%.8g",
+ logf(2), logf(2), (float)log_2, (float)log_2);
+ ATF_CHECK_MSG(fabs((log(2) - log_2)/log_2) < 2*DBL_EPSILON,
+ "log(2)=%a=%.17g expected %a=%.17g",
+ log(2), log(2), (double)log_2, (double)log_2);
+ ATF_CHECK_MSG(fabsl((logl(2) - log_2)/log_2) < 2*LDBL_EPSILON,
+ "logl(2)=%La=%.34Lg expected %La=%.34Lg",
+ logl(2), logl(2), log_2, log_2);
-ATF_TC(logf_one_pos);
-ATF_TC_HEAD(logf_one_pos, tc)
-{
- atf_tc_set_md_var(tc, "descr", "Test logf(1.0) == +0.0");
-}
+ ATF_CHECK_MSG(fabsf((logf(e) - 1)/1) < 2*FLT_EPSILON,
+ "logf(e)=%a=%.8g", logf(e), logf(e));
+ ATF_CHECK_MSG(fabs((log(e) - 1)/1) < 2*DBL_EPSILON,
+ "log(e)=%a=%.17g", log(e), log(e));
+ ATF_CHECK_MSG(fabsl((logl(e) - 1)/1) < 2*LDBL_EPSILON,
+ "logl(e)=%La=%.34Lg", logl(e), logl(e));
-ATF_TC_BODY(logf_one_pos, tc)
-{
- const float x = logf(1.0);
- const float y = 0.0L;
+ ATF_CHECK_MSG(fabsf((logf(e2) - 2)/2) < 2*FLT_EPSILON,
+ "logf(e)=%a=%.8g", logf(e2), logf(e2));
+ ATF_CHECK_MSG(fabs((log(e2) - 2)/2) < 2*DBL_EPSILON,
+ "log(e)=%a=%.17g", log(e2), log(e2));
+ ATF_CHECK_MSG(fabsl((logl(e2) - 2)/2) < 2*LDBL_EPSILON,
+ "logl(e)=%La=%.34Lg", logl(e2), logl(e2));
- ATF_CHECK(x == y);
- ATF_CHECK(signbit(x) == 0);
- ATF_CHECK(signbit(y) == 0);
+ ATF_CHECK_MSG(fabsf((logf(10) - log_10)/log_10) < 2*FLT_EPSILON,
+ "logf(10)=%a=%.8g expected %a=%.8g",
+ logf(10), logf(10), (float)log_10, (float)log_10);
+ ATF_CHECK_MSG(fabs((log(10) - log_10)/log_10) < 2*DBL_EPSILON,
+ "log(10)=%a=%.17g expected %a=%.17g",
+ log(10), log(10), (double)log_10, (double)log_10);
+ ATF_CHECK_MSG(fabsl((logl(10) - log_10)/log_10) < 2*LDBL_EPSILON,
+ "logl(10)=%La=%.34Lg expected %La=%.34Lg",
+ logl(10), logl(10), log_10, log_10);
}
-ATF_TC(logf_zero_neg);
-ATF_TC_HEAD(logf_zero_neg, tc)
+ATF_TC(log_inf);
+ATF_TC_HEAD(log_inf, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test logf(-0.0) == -HUGE_VALF");
-}
-
-ATF_TC_BODY(logf_zero_neg, tc)
-{
- const float x = -0.0L;
-
- ATF_CHECK(logf(x) == -HUGE_VALF);
+ atf_tc_set_md_var(tc, "descr", "Test log/f/l on +infinity");
}
-
-ATF_TC(logf_zero_pos);
-ATF_TC_HEAD(logf_zero_pos, tc)
+ATF_TC_BODY(log_inf, tc)
{
- atf_tc_set_md_var(tc, "descr", "Test logf(+0.0) == -HUGE_VALF");
-}
-ATF_TC_BODY(logf_zero_pos, tc)
-{
- const float x = 0.0L;
+ if (!isinf(INFINITY))
+ atf_tc_skip("no infinities on this architecture");
- ATF_CHECK(logf(x) == -HUGE_VALF);
+ CHECK_EQ(0, logf, INFINITY, INFINITY);
+ CHECK_EQ(0, log, INFINITY, INFINITY);
+ CHECKL_EQ(0, logl, INFINITY, INFINITY);
}
ATF_TP_ADD_TCS(tp)
{
- ATF_TP_ADD_TC(tp, log10_base);
- ATF_TP_ADD_TC(tp, log10_nan);
- ATF_TP_ADD_TC(tp, log10_inf_neg);
- ATF_TP_ADD_TC(tp, log10_inf_pos);
- ATF_TP_ADD_TC(tp, log10_one_pos);
- ATF_TP_ADD_TC(tp, log10_zero_neg);
- ATF_TP_ADD_TC(tp, log10_zero_pos);
-
- ATF_TP_ADD_TC(tp, log10f_base);
- ATF_TP_ADD_TC(tp, log10f_nan);
- ATF_TP_ADD_TC(tp, log10f_inf_neg);
- ATF_TP_ADD_TC(tp, log10f_inf_pos);
- ATF_TP_ADD_TC(tp, log10f_one_pos);
- ATF_TP_ADD_TC(tp, log10f_zero_neg);
- ATF_TP_ADD_TC(tp, log10f_zero_pos);
-
- ATF_TP_ADD_TC(tp, log1p_nan);
- ATF_TP_ADD_TC(tp, log1p_inf_neg);
- ATF_TP_ADD_TC(tp, log1p_inf_pos);
- ATF_TP_ADD_TC(tp, log1p_one_neg);
- ATF_TP_ADD_TC(tp, log1p_zero_neg);
- ATF_TP_ADD_TC(tp, log1p_zero_pos);
-
- ATF_TP_ADD_TC(tp, log1pf_nan);
- ATF_TP_ADD_TC(tp, log1pf_inf_neg);
- ATF_TP_ADD_TC(tp, log1pf_inf_pos);
- ATF_TP_ADD_TC(tp, log1pf_one_neg);
- ATF_TP_ADD_TC(tp, log1pf_zero_neg);
- ATF_TP_ADD_TC(tp, log1pf_zero_pos);
-
- ATF_TP_ADD_TC(tp, log2_base);
- ATF_TP_ADD_TC(tp, log2_nan);
- ATF_TP_ADD_TC(tp, log2_inf_neg);
- ATF_TP_ADD_TC(tp, log2_inf_pos);
- ATF_TP_ADD_TC(tp, log2_one_pos);
- ATF_TP_ADD_TC(tp, log2_zero_neg);
- ATF_TP_ADD_TC(tp, log2_zero_pos);
+ ATF_TP_ADD_TC(tp, log10_invalid);
+ ATF_TP_ADD_TC(tp, log10_zero);
+ ATF_TP_ADD_TC(tp, log10_exact);
+ ATF_TP_ADD_TC(tp, log10_approx);
+ ATF_TP_ADD_TC(tp, log10_inf);
- ATF_TP_ADD_TC(tp, log2f_base);
- ATF_TP_ADD_TC(tp, log2f_nan);
- ATF_TP_ADD_TC(tp, log2f_inf_neg);
- ATF_TP_ADD_TC(tp, log2f_inf_pos);
- ATF_TP_ADD_TC(tp, log2f_one_pos);
- ATF_TP_ADD_TC(tp, log2f_zero_neg);
- ATF_TP_ADD_TC(tp, log2f_zero_pos);
+ ATF_TP_ADD_TC(tp, log1p_invalid);
+ ATF_TP_ADD_TC(tp, log1p_neg_one);
+ ATF_TP_ADD_TC(tp, log1p_exact);
+ ATF_TP_ADD_TC(tp, log1p_approx);
+ ATF_TP_ADD_TC(tp, log1p_inf);
- ATF_TP_ADD_TC(tp, log_base);
- ATF_TP_ADD_TC(tp, log_nan);
- ATF_TP_ADD_TC(tp, log_inf_neg);
- ATF_TP_ADD_TC(tp, log_inf_pos);
- ATF_TP_ADD_TC(tp, log_one_pos);
- ATF_TP_ADD_TC(tp, log_zero_neg);
- ATF_TP_ADD_TC(tp, log_zero_pos);
+ ATF_TP_ADD_TC(tp, log2_invalid);
+ ATF_TP_ADD_TC(tp, log2_zero);
+ ATF_TP_ADD_TC(tp, log2_exact);
+ ATF_TP_ADD_TC(tp, log2_approx);
+ ATF_TP_ADD_TC(tp, log2_inf);
- ATF_TP_ADD_TC(tp, logf_base);
- ATF_TP_ADD_TC(tp, logf_nan);
- ATF_TP_ADD_TC(tp, logf_inf_neg);
- ATF_TP_ADD_TC(tp, logf_inf_pos);
- ATF_TP_ADD_TC(tp, logf_one_pos);
- ATF_TP_ADD_TC(tp, logf_zero_neg);
- ATF_TP_ADD_TC(tp, logf_zero_pos);
+ ATF_TP_ADD_TC(tp, log_invalid);
+ ATF_TP_ADD_TC(tp, log_zero);
+ ATF_TP_ADD_TC(tp, log_exact);
+ ATF_TP_ADD_TC(tp, log_approx);
+ ATF_TP_ADD_TC(tp, log_inf);
return atf_no_error();
}
diff --git a/lib/libm/t_modf.c b/lib/libm/t_modf.c
index a856b15d1aab..90039c1eb10f 100644
--- a/lib/libm/t_modf.c
+++ b/lib/libm/t_modf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_modf.c,v 1.1 2014/06/16 12:54:43 joerg Exp $ */
+/* $NetBSD: t_modf.c,v 1.6 2024/05/15 00:02:57 riastradh Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -29,40 +29,411 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_modf.c,v 1.6 2024/05/15 00:02:57 riastradh Exp $");
+
#include <atf-c.h>
#include <float.h>
#include <math.h>
+__CTASSERT(FLT_RADIX == 2);
+
+static const struct {
+ float x, i, f;
+} casesf[] = {
+ { 0, 0, 0 },
+ { FLT_MIN, 0, FLT_MIN },
+ { 0.5, 0, 0.5 },
+ { 1 - FLT_EPSILON/2, 0, 1 - FLT_EPSILON/2 },
+ { 1, 1, 0 },
+ { 1 + FLT_EPSILON, 1, FLT_EPSILON },
+ { 0.5/FLT_EPSILON - 0.5, 0.5/FLT_EPSILON - 1, 0.5 },
+ { 0.5/FLT_EPSILON, 0.5/FLT_EPSILON, 0 },
+ { 0.5/FLT_EPSILON + 0.5, 0.5/FLT_EPSILON, 0.5 },
+ { 1/FLT_EPSILON, 1/FLT_EPSILON, 0 },
+};
+
+static const struct {
+ double x, i, f;
+} cases[] = {
+ { 0, 0, 0 },
+ { DBL_MIN, 0, DBL_MIN },
+ { 0.5, 0, 0.5 },
+ { 1 - DBL_EPSILON/2, 0, 1 - DBL_EPSILON/2 },
+ { 1, 1, 0 },
+ { 1 + DBL_EPSILON, 1, DBL_EPSILON },
+ { 1/FLT_EPSILON + 0.5, 1/FLT_EPSILON, 0.5 },
+ { 0.5/DBL_EPSILON - 0.5, 0.5/DBL_EPSILON - 1, 0.5 },
+ { 0.5/DBL_EPSILON, 0.5/DBL_EPSILON, 0 },
+ { 0.5/DBL_EPSILON + 0.5, 0.5/DBL_EPSILON, 0.5 },
+ { 1/DBL_EPSILON, 1/DBL_EPSILON, 0 },
+};
+
+#ifdef __HAVE_LONG_DOUBLE
+static const struct {
+ long double x, i, f;
+} casesl[] = {
+ { 0, 0, 0 },
+ { LDBL_MIN, 0, LDBL_MIN },
+ { 0.5, 0, 0.5 },
+ { 1 - LDBL_EPSILON/2, 0, 1 - LDBL_EPSILON/2 },
+ { 1, 1, 0 },
+ { 1 + LDBL_EPSILON, 1, LDBL_EPSILON },
+ { 1.0L/DBL_EPSILON + 0.5L, 1.0L/DBL_EPSILON, 0.5 },
+ { 0.5/LDBL_EPSILON - 0.5L, 0.5/LDBL_EPSILON - 1, 0.5 },
+ { 0.5/LDBL_EPSILON, 0.5/LDBL_EPSILON, 0 },
+ { 0.5/LDBL_EPSILON + 0.5L, 0.5/LDBL_EPSILON, 0.5 },
+ { 1/LDBL_EPSILON, 1/LDBL_EPSILON, 0 },
+};
+#endif /* __HAVE_LONG_DOUBLE */
+
+ATF_TC(modff);
+ATF_TC_HEAD(modff, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "modff(3)");
+}
+ATF_TC_BODY(modff, tc)
+{
+ unsigned n;
+
+ for (n = 0; n < __arraycount(casesf); n++) {
+ float x, i, f;
+
+ x = casesf[n].x;
+ f = modff(x, &i);
+ ATF_CHECK_EQ_MSG(i, casesf[n].i,
+ "casesf[%u]: modff %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ ATF_CHECK_EQ_MSG(f, casesf[n].f,
+ "casesf[%u]: modff %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+
+ f = modff(-x, &i);
+ ATF_CHECK_EQ_MSG(i, -casesf[n].i,
+ "casesf[%u]: modff %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ ATF_CHECK_EQ_MSG(f, -casesf[n].f,
+ "casesf[%u]: modff %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ }
+
+ if (isinf(INFINITY)) {
+ float x, i, f;
+
+ x = INFINITY;
+ f = modff(x, &i);
+ ATF_CHECK_MSG(f == 0,
+ "modff +inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ ATF_CHECK_MSG(isinf(i) && i > 0,
+ "modff +inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+
+ x = -INFINITY;
+ f = modff(x, &i);
+ ATF_CHECK_MSG(f == 0,
+ "modff -inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ ATF_CHECK_MSG(isinf(i) && i < 0,
+ "modff -inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ }
+
+#ifdef NAN
+ {
+ float x, i, f;
+
+ x = NAN;
+ f = modff(x, &i);
+ ATF_CHECK_MSG(isnan(f),
+ "modff NaN returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ ATF_CHECK_MSG(isnan(i),
+ "modff NaN returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ }
+#endif /* NAN */
+}
+
ATF_TC(modf);
ATF_TC_HEAD(modf, tc)
{
- atf_tc_set_md_var(tc, "descr","Check modf family");
+ atf_tc_set_md_var(tc, "descr", "modf(3)");
}
-
ATF_TC_BODY(modf, tc)
{
- float basef;
- double base;
- long double basel;
- ATF_CHECK(modff(1.0, &basef) == 0.0);
- ATF_CHECK(basef == 1.0);
- ATF_CHECK(modf(1.0, &base) == 0.0);
- ATF_CHECK(base == 1.0);
- ATF_CHECK(modfl(1.0, &basel) == 0.0);
- ATF_CHECK(basel == 1.0);
+ unsigned n;
+
+ for (n = 0; n < __arraycount(casesf); n++) {
+ double x, i, f;
+
+ x = casesf[n].x;
+ f = modf(x, &i);
+ ATF_CHECK_EQ_MSG(i, casesf[n].i,
+ "casesf[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ ATF_CHECK_EQ_MSG(f, casesf[n].f,
+ "casesf[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+
+ f = modf(-x, &i);
+ ATF_CHECK_EQ_MSG(i, -casesf[n].i,
+ "casesf[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ ATF_CHECK_EQ_MSG(f, -casesf[n].f,
+ "casesf[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ }
+
+ for (n = 0; n < __arraycount(cases); n++) {
+ double x, i, f;
+
+ x = cases[n].x;
+ f = modf(x, &i);
+ ATF_CHECK_EQ_MSG(i, cases[n].i,
+ "cases[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+ ATF_CHECK_EQ_MSG(f, cases[n].f,
+ "cases[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+
+ f = modf(-x, &i);
+ ATF_CHECK_EQ_MSG(i, -cases[n].i,
+ "cases[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+ ATF_CHECK_EQ_MSG(f, -cases[n].f,
+ "cases[%u]: modf %g=%a"
+ " returned integer %g=%a, frac %g=%a;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+ }
+
+ if (isinf(INFINITY)) {
+ double x, i, f;
+
+ x = INFINITY;
+ f = modf(x, &i);
+ ATF_CHECK_MSG(f == 0,
+ "modf +inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ ATF_CHECK_MSG(isinf(i) && i > 0,
+ "modf +inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+
+ x = -INFINITY;
+ f = modf(x, &i);
+ ATF_CHECK_MSG(f == 0,
+ "modf -inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ ATF_CHECK_MSG(isinf(i) && i < 0,
+ "modf -inf returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ }
+
+#ifdef NAN
+ {
+ double x, i, f;
+
+ x = NAN;
+ f = modf(x, &i);
+ ATF_CHECK_MSG(isnan(f),
+ "modf NaN returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ ATF_CHECK_MSG(isnan(i),
+ "modf NaN returned integer %g=%a, frac %g=%a",
+ i, i, f, f);
+ }
+#endif /* NAN */
+}
+
+ATF_TC(modfl);
+ATF_TC_HEAD(modfl, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "modfl(3)");
+}
+ATF_TC_BODY(modfl, tc)
+{
+ unsigned n;
+
+ for (n = 0; n < __arraycount(casesf); n++) {
+ long double x, i, f;
+
+ x = casesf[n].x;
+ f = modfl(x, &i);
+ ATF_CHECK_EQ_MSG(i, casesf[n].i,
+ "casesf[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ ATF_CHECK_EQ_MSG(f, casesf[n].f,
+ "casesf[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+
+ f = modfl(-x, &i);
+ ATF_CHECK_EQ_MSG(i, -casesf[n].i,
+ "casesf[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ ATF_CHECK_EQ_MSG(f, -casesf[n].f,
+ "casesf[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ casesf[n].i, casesf[n].i, casesf[n].f, casesf[n].f);
+ }
+
+ for (n = 0; n < __arraycount(cases); n++) {
+ long double x, i, f;
+
+ x = cases[n].x;
+ f = modfl(x, &i);
+ ATF_CHECK_EQ_MSG(i, cases[n].i,
+ "cases[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+ ATF_CHECK_EQ_MSG(f, cases[n].f,
+ "cases[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+
+ f = modfl(-x, &i);
+ ATF_CHECK_EQ_MSG(i, -cases[n].i,
+ "cases[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+ ATF_CHECK_EQ_MSG(f, -cases[n].f,
+ "cases[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %g=%a, frac %g=%a",
+ n, x, x, i, i, f, f,
+ cases[n].i, cases[n].i, cases[n].f, cases[n].f);
+ }
+
+#ifdef __HAVE_LONG_DOUBLE
+ for (n = 0; n < __arraycount(casesl); n++) {
+ long double x, i, f;
+
+ x = casesl[n].x;
+ f = modfl(x, &i);
+ ATF_CHECK_EQ_MSG(i, casesl[n].i,
+ "casesl[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %Lg=%La, frac %Lg=%La",
+ n, x, x, i, i, f, f,
+ casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
+ ATF_CHECK_EQ_MSG(f, casesl[n].f,
+ "casesl[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %Lg=%La, frac %Lg=%La",
+ n, x, x, i, i, f, f,
+ casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
+
+ f = modfl(-x, &i);
+ ATF_CHECK_EQ_MSG(i, -casesl[n].i,
+ "casesl[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %Lg=%La, frac %Lg=%La",
+ n, x, x, i, i, f, f,
+ casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
+ ATF_CHECK_EQ_MSG(f, -casesl[n].f,
+ "casesl[%u]: modfl %Lg=%La"
+ " returned integer %Lg=%La, frac %Lg=%La;"
+ " expected integer %Lg=%La, frac %Lg=%La",
+ n, x, x, i, i, f, f,
+ casesl[n].i, casesl[n].i, casesl[n].f, casesl[n].f);
+ }
+#endif /* __HAVE_LONG_DOUBLE */
+
+ if (isinf(INFINITY)) {
+ long double x, i, f;
+
+ x = INFINITY;
+ f = modfl(x, &i);
+ ATF_CHECK_MSG(f == 0,
+ "modfl +inf returned integer %Lg=%La, frac %Lg=%La",
+ i, i, f, f);
+ ATF_CHECK_MSG(isinf(i) && i > 0,
+ "modfl +inf returned integer %Lg=%La, frac %Lg=%La",
+ i, i, f, f);
+
+ x = -INFINITY;
+ f = modfl(x, &i);
+ ATF_CHECK_MSG(f == 0,
+ "modfl -inf returned integer %Lg=%La, frac %Lg=%La",
+ i, i, f, f);
+ ATF_CHECK_MSG(isinf(i) && i < 0,
+ "modfl -inf returned integer %Lg=%La, frac %Lg=%La",
+ i, i, f, f);
+ }
+
+#ifdef NAN
+ {
+ long double x, i, f;
- ATF_CHECK(modff(-1 - FLT_EPSILON, &basef) == -FLT_EPSILON);
- ATF_CHECK(basef == -1.0);
- ATF_CHECK(modf(-1 - DBL_EPSILON, &base) == -DBL_EPSILON);
- ATF_CHECK(base == -1.0);
- ATF_CHECK(modfl(-1 - LDBL_EPSILON, &basel) == -LDBL_EPSILON);
- ATF_CHECK(basel == -1.0);
+ x = NAN;
+ f = modfl(x, &i);
+ ATF_CHECK_MSG(isnan(f),
+ "modfl NaN returned integer %Lg=%La, frac %Lg=%La",
+ i, i, f, f);
+ ATF_CHECK_MSG(isnan(i),
+ "modfl NaN returned integer %Lg=%La, frac %Lg=%La",
+ i, i, f, f);
+ }
+#endif /* NAN */
}
ATF_TP_ADD_TCS(tp)
{
+ ATF_TP_ADD_TC(tp, modff);
ATF_TP_ADD_TC(tp, modf);
+ ATF_TP_ADD_TC(tp, modfl);
return atf_no_error();
}
diff --git a/lib/libm/t_pow.c b/lib/libm/t_pow.c
index 7afee9f6dffa..8e2e10f0a84d 100644
--- a/lib/libm/t_pow.c
+++ b/lib/libm/t_pow.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_pow.c,v 1.5 2017/01/20 21:15:56 maya Exp $ */
+/* $NetBSD: t_pow.c,v 1.6 2024/06/09 16:53:25 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_pow.c,v 1.5 2017/01/20 21:15:56 maya Exp $");
+__RCSID("$NetBSD: t_pow.c,v 1.6 2024/06/09 16:53:25 riastradh Exp $");
#include <atf-c.h>
#include <math.h>
@@ -45,9 +45,10 @@ ATF_TC_HEAD(pow_nan_x, tc)
ATF_TC_BODY(pow_nan_x, tc)
{
- const double x = 0.0L / 0.0L;
+ const volatile double x = 0.0 / 0.0;
+ const double z = pow(x, 2.0);
- ATF_CHECK(isnan(pow(x, 2.0)) != 0);
+ ATF_CHECK_MSG(isnan(z), "z=%a", z);
}
ATF_TC(pow_nan_y);
@@ -58,9 +59,10 @@ ATF_TC_HEAD(pow_nan_y, tc)
ATF_TC_BODY(pow_nan_y, tc)
{
- const double y = 0.0L / 0.0L;
+ const volatile double y = 0.0 / 0.0;
+ const double z = pow(2.0, y);
- ATF_CHECK(isnan(pow(2.0, y)) != 0);
+ ATF_CHECK_MSG(isnan(z), "z=%a", z);
}
ATF_TC(pow_inf_neg_x);
@@ -71,7 +73,7 @@ ATF_TC_HEAD(pow_inf_neg_x, tc)
ATF_TC_BODY(pow_inf_neg_x, tc)
{
- const double x = -1.0L / 0.0L;
+ const volatile double x = -1.0 / 0.0;
double z;
/*
@@ -79,28 +81,24 @@ ATF_TC_BODY(pow_inf_neg_x, tc)
* If y is even, y > 0, and x is -Inf, +Inf is returned.
*/
z = pow(x, 3.0);
-
- if (isinf(z) == 0 || signbit(z) == 0)
- atf_tc_fail_nonfatal("pow(-Inf, 3.0) != -Inf");
+ ATF_CHECK_MSG(isinf(z), "x=%a z=%s=%a", x, "pow(x, 3.0)", z);
+ ATF_CHECK_MSG(signbit(z) != 0, "x=%a z=%s=%a", x, "pow(x, 3.0)", z);
z = pow(x, 4.0);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(-Inf, 4.0) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "x=%a z=%s=%a", x, "pow(x, 4.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "pow(x, 4.0)", z);
/*
* If y is odd, y < 0, and x is -Inf, -0.0 is returned.
* If y is even, y < 0, and x is -Inf, +0.0 is returned.
*/
z = pow(x, -3.0);
-
- if (fabs(z) > 0.0 || signbit(z) == 0)
- atf_tc_fail_nonfatal("pow(-Inf, -3.0) != -0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "x=%a z=%s=%a", x, "pow(x, -3.0)", z);
+ ATF_CHECK_MSG(signbit(z) != 0, "x=%a z=%s=%a", x, "pow(x, -3.0)", z);
z = pow(x, -4.0);
-
- if (fabs(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(-Inf -4.0) != +0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "x=%a z=%s=%a", x, "pow(x, -4.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "pow(x, -4.0)", z);
}
ATF_TC(pow_inf_neg_y);
@@ -111,7 +109,7 @@ ATF_TC_HEAD(pow_inf_neg_y, tc)
ATF_TC_BODY(pow_inf_neg_y, tc)
{
- const double y = -1.0L / 0.0L;
+ const volatile double y = -1.0 / 0.0;
double z;
/*
@@ -119,14 +117,12 @@ ATF_TC_BODY(pow_inf_neg_y, tc)
* If |x| > 1 and y is -Inf, +0.0 is returned.
*/
z = pow(0.1, y);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(0.1, -Inf) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "y=%a z=%s=%a", y, "pow(0.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "pow(0.1, y)", z);
z = pow(1.1, y);
-
- if (fabs(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(1.1, -Inf) != +0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "y=%a z=%s=%a", y, "pow(1.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "pow(1.1, y)", z);
}
ATF_TC(pow_inf_pos_x);
@@ -137,7 +133,7 @@ ATF_TC_HEAD(pow_inf_pos_x, tc)
ATF_TC_BODY(pow_inf_pos_x, tc)
{
- const double x = 1.0L / 0.0L;
+ const volatile double x = 1.0 / 0.0;
double z;
/*
@@ -145,14 +141,12 @@ ATF_TC_BODY(pow_inf_pos_x, tc)
* For y > 0, if x is +Inf, +Inf is returned.
*/
z = pow(x, -2.0);
-
- if (fabs(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(+Inf, -2.0) != +0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "x=%a z=%s=%a", x, "pow(x, -2.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "pow(x, -2.0)", z);
z = pow(x, 2.0);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(+Inf, 2.0) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "x=%a z=%s=%a", x, "pow(x, 2.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "pow(x, 2.0)", z);
}
ATF_TC(pow_inf_pos_y);
@@ -163,7 +157,7 @@ ATF_TC_HEAD(pow_inf_pos_y, tc)
ATF_TC_BODY(pow_inf_pos_y, tc)
{
- const double y = 1.0L / 0.0L;
+ const volatile double y = 1.0 / 0.0;
double z;
/*
@@ -171,14 +165,12 @@ ATF_TC_BODY(pow_inf_pos_y, tc)
* If |x| > 1 and y is +Inf, +Inf is returned.
*/
z = pow(0.1, y);
-
- if (fabs(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(0.1, +Inf) != +0.0");
+ ATF_CHECK_MSG(fabs(z) == 0, "y=%a z=%s=%a", y, "pow(0.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "pow(0.1, y)", z);
z = pow(1.1, y);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(1.1, +Inf) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "y=%a z=%s=%a", y, "pow(1.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "pow(1.1, y)", z);
}
ATF_TC(pow_one_neg_x);
@@ -189,24 +181,18 @@ ATF_TC_HEAD(pow_one_neg_x, tc)
ATF_TC_BODY(pow_one_neg_x, tc)
{
- const double infp = 1.0L / 0.0L;
- const double infn = -1.0L / 0.0L;
+ const volatile double infp = 1.0 / 0.0;
+ const volatile double infn = -1.0 / 0.0;
+ double z;
/*
* If x is -1.0, and y is +-Inf, 1.0 shall be returned.
*/
- ATF_REQUIRE(isinf(infp) != 0);
- ATF_REQUIRE(isinf(infn) != 0);
+ ATF_REQUIRE_MSG(isinf(infp), "infp=%a", infp);
+ ATF_REQUIRE_MSG(isinf(infn), "infn=%a", infn);
- if (pow(-1.0, infp) != 1.0) {
- atf_tc_expect_fail("PR lib/45372");
- atf_tc_fail_nonfatal("pow(-1.0, +Inf) != 1.0");
- }
-
- if (pow(-1.0, infn) != 1.0) {
- atf_tc_expect_fail("PR lib/45372");
- atf_tc_fail_nonfatal("pow(-1.0, -Inf) != 1.0");
- }
+ ATF_CHECK_EQ_MSG((z = pow(-1.0, infp)), 1.0, "z=%a", z);
+ ATF_CHECK_EQ_MSG((z = pow(-1.0, infn)), 1.0, "z=%a", z);
}
ATF_TC(pow_one_pos_x);
@@ -217,21 +203,22 @@ ATF_TC_HEAD(pow_one_pos_x, tc)
ATF_TC_BODY(pow_one_pos_x, tc)
{
- const double y[] = { 0.0, 0.1, 2.0, -3.0, 99.0, 99.99, 9999999.9 };
- const double z = 0.0L / 0.0L;
+ const volatile double y[] =
+ { 0.0, 0.1, 2.0, -3.0, 99.0, 99.99, 9999999.9 };
+ const volatile double z = 0.0 / 0.0;
size_t i;
/*
* For any value of y (including NaN),
* if x is 1.0, 1.0 shall be returned.
*/
- if (pow(1.0, z) != 1.0)
- atf_tc_fail_nonfatal("pow(1.0, NaN) != 1.0");
+ ATF_CHECK_EQ_MSG(pow(1.0, z), 1.0, "z=%a pow(1.0, z)=%a",
+ z, pow(1.0, z));
for (i = 0; i < __arraycount(y); i++) {
-
- if (pow(1.0, y[i]) != 1.0)
- atf_tc_fail_nonfatal("pow(1.0, %0.01f) != 1.0", y[i]);
+ ATF_CHECK_EQ_MSG(pow(1.0, y[i]), 1.0,
+ "i=%zu y[i]=%a pow(1.0, y[i])=%a",
+ i, y[i], pow(1.0, y[i]));
}
}
@@ -250,55 +237,40 @@ ATF_TC_BODY(pow_zero_x, tc)
* is an odd integer, x is returned.
*/
z = pow(+0.0, 3.0);
-
- if (fabs(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(+0.0, 3.0) != +0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "z=%a", z);
z = pow(-0.0, 3.0);
-
- if (fabs(z) > 0.0 || signbit(z) == 0)
- atf_tc_fail_nonfatal("pow(-0.0, 3.0) != -0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) != 0, "z=%a", z);
/*
* If y > 0 and not an odd integer,
* if x is +0.0 or -0.0, +0.0 is returned.
*/
z = pow(+0.0, 4.0);
-
- if (fabs(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(+0.0, 4.0) != +0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "z=%a", z);
z = pow(-0.0, 4.0);
-
- if (fabs(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("pow(-0.0, 4.0) != +0.0");
+ ATF_CHECK_MSG(fabs(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "z=%a", z);
/*
* If y < 0 and x is +0.0 or -0.0, either +-HUGE_VAL,
* +-HUGE_VALF, or +-HUGE_VALL shall be returned.
*/
z = pow(+0.0, -4.0);
-
- if (z != HUGE_VAL) {
- atf_tc_fail_nonfatal("pow(+0.0, -4.0) != HUGE_VAL");
- }
+ ATF_CHECK_EQ_MSG(z, HUGE_VAL, "z=%a", z);
z = pow(-0.0, -4.0);
-
- if (z != HUGE_VAL) {
- atf_tc_fail_nonfatal("pow(-0.0, -4.0) != HUGE_VAL");
- }
+ ATF_CHECK_EQ_MSG(z, HUGE_VAL, "z=%a", z);
z = pow(+0.0, -5.0);
-
- if (z != HUGE_VAL) {
- atf_tc_fail_nonfatal("pow(+0.0, -5.0) != HUGE_VAL");
- }
+ ATF_CHECK_EQ_MSG(z, HUGE_VAL, "z=%a", z);
z = pow(-0.0, -5.0);
-
- if (z != -HUGE_VAL)
- atf_tc_fail_nonfatal("pow(-0.0, -5.0) != -HUGE_VAL");
+ ATF_CHECK_EQ_MSG(z, -HUGE_VAL, "z=%a", z);
}
ATF_TC(pow_zero_y);
@@ -309,27 +281,24 @@ ATF_TC_HEAD(pow_zero_y, tc)
ATF_TC_BODY(pow_zero_y, tc)
{
- const double x[] = { 0.1, -3.0, 77.0, 99.99, 101.0000001 };
- const double z = 0.0L / 0.0L;
+ const volatile double x[] = { 0.1, -3.0, 77.0, 99.99, 101.0000001 };
+ const volatile double z = 0.0 / 0.0;
size_t i;
/*
* For any value of x (including NaN),
* if y is +0.0 or -0.0, 1.0 is returned.
*/
- if (pow(z, +0.0) != 1.0)
- atf_tc_fail_nonfatal("pow(NaN, +0.0) != 1.0");
-
- if (pow(z, -0.0) != 1.0)
- atf_tc_fail_nonfatal("pow(NaN, -0.0) != 1.0");
+ ATF_CHECK_EQ_MSG(pow(z, +0.0), 1.0, "z=%a pow(z, +0.0)=%a",
+ z, pow(z, +0.0));
+ ATF_CHECK_EQ_MSG(pow(z, -0.0), 1.0, "z=%a pow(z, -0.0)=%a",
+ z, pow(z, -0.0));
for (i = 0; i < __arraycount(x); i++) {
-
- if (pow(x[i], +0.0) != 1.0)
- atf_tc_fail_nonfatal("pow(%0.01f, +0.0) != 1.0", x[i]);
-
- if (pow(x[i], -0.0) != 1.0)
- atf_tc_fail_nonfatal("pow(%0.01f, -0.0) != 1.0", x[i]);
+ ATF_CHECK_EQ_MSG(pow(x[i], +0.0), 1.0,
+ "i=%zu pow(%a, +0.0)=%a", i, x[i], pow(x[i], +0.0));
+ ATF_CHECK_EQ_MSG(pow(x[i], -0.0), 1.0,
+ "i=%zu pow(%a, -0.0)=%a", i, x[i], pow(x[i], -0.0));
}
}
@@ -344,9 +313,10 @@ ATF_TC_HEAD(powf_nan_x, tc)
ATF_TC_BODY(powf_nan_x, tc)
{
- const float x = 0.0L / 0.0L;
+ const volatile float x = 0.0f / 0.0f;
+ const float z = powf(x, 2.0f);
- ATF_CHECK(isnanf(powf(x, 2.0)) != 0);
+ ATF_CHECK_MSG(isnanf(z), "z=%a", z);
}
ATF_TC(powf_nan_y);
@@ -357,9 +327,10 @@ ATF_TC_HEAD(powf_nan_y, tc)
ATF_TC_BODY(powf_nan_y, tc)
{
- const float y = 0.0L / 0.0L;
+ const volatile float y = 0.0f / 0.0f;
+ const float z = powf(2.0f, y);
- ATF_CHECK(isnanf(powf(2.0, y)) != 0);
+ ATF_CHECK_MSG(isnanf(z), "z=%a", z);
}
ATF_TC(powf_inf_neg_x);
@@ -370,7 +341,7 @@ ATF_TC_HEAD(powf_inf_neg_x, tc)
ATF_TC_BODY(powf_inf_neg_x, tc)
{
- const float x = -1.0L / 0.0L;
+ const volatile float x = -1.0f / 0.0f;
float z;
/*
@@ -378,30 +349,24 @@ ATF_TC_BODY(powf_inf_neg_x, tc)
* If y is even, y > 0, and x is -Inf, +Inf is returned.
*/
z = powf(x, 3.0);
-
- if (isinf(z) == 0 || signbit(z) == 0)
- atf_tc_fail_nonfatal("powf(-Inf, 3.0) != -Inf");
+ ATF_CHECK_MSG(isinf(z), "x=%a z=%s=%a", x, "powf(x, 3.0)", z);
+ ATF_CHECK_MSG(signbit(z) != 0, "x=%a z=%s=%a", x, "powf(x, 3.0)", z);
z = powf(x, 4.0);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(-Inf, 4.0) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "x=%a z=%s=%a", x, "powf(x, 4.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "powf(x, 4.0)", z);
/*
* If y is odd, y < 0, and x is -Inf, -0.0 is returned.
* If y is even, y < 0, and x is -Inf, +0.0 is returned.
*/
z = powf(x, -3.0);
-
- if (fabsf(z) > 0.0 || signbit(z) == 0) {
- atf_tc_expect_fail("PR lib/45372");
- atf_tc_fail_nonfatal("powf(-Inf, -3.0) != -0.0");
- }
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "x=%a z=%s=%a", x, "powf(x, -3.0)", z);
+ ATF_CHECK_MSG(signbit(z) != 0, "x=%a z=%s=%a", x, "powf(x, -3.0)", z);
z = powf(x, -4.0);
-
- if (fabsf(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(-Inf -4.0) != +0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "x=%a z=%s=%a", x, "powf(x, -4.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "powf(x, -4.0)", z);
}
ATF_TC(powf_inf_neg_y);
@@ -412,7 +377,7 @@ ATF_TC_HEAD(powf_inf_neg_y, tc)
ATF_TC_BODY(powf_inf_neg_y, tc)
{
- const float y = -1.0L / 0.0L;
+ const volatile float y = -1.0f / 0.0f;
float z;
/*
@@ -420,14 +385,12 @@ ATF_TC_BODY(powf_inf_neg_y, tc)
* If |x| > 1 and y is -Inf, +0.0 is returned.
*/
z = powf(0.1, y);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(0.1, -Inf) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "y=%a z=%s=%a", y, "powf(0.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "powf(0.1, y)", z);
z = powf(1.1, y);
-
- if (fabsf(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(1.1, -Inf) != +0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "y=%a z=%s=%a", y, "powf(1.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "powf(1.1, y)", z);
}
ATF_TC(powf_inf_pos_x);
@@ -438,7 +401,7 @@ ATF_TC_HEAD(powf_inf_pos_x, tc)
ATF_TC_BODY(powf_inf_pos_x, tc)
{
- const float x = 1.0L / 0.0L;
+ const volatile float x = 1.0f / 0.0f;
float z;
/*
@@ -446,14 +409,12 @@ ATF_TC_BODY(powf_inf_pos_x, tc)
* For y > 0, if x is +Inf, +Inf is returned.
*/
z = powf(x, -2.0);
-
- if (fabsf(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(+Inf, -2.0) != +0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "x=%a z=%s=%a", x, "powf(x, -2.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "powf(x, -2.0)", z);
z = powf(x, 2.0);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(+Inf, 2.0) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "x=%a z=%s=%a", x, "powf(x, 2.0)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "x=%a z=%s=%a", x, "powf(x, 2.0)", z);
}
ATF_TC(powf_inf_pos_y);
@@ -472,14 +433,12 @@ ATF_TC_BODY(powf_inf_pos_y, tc)
* If |x| > 1 and y is +Inf, +Inf is returned.
*/
z = powf(0.1, y);
-
- if (fabsf(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(0.1, +Inf) != +0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "y=%a z=%s=%a", y, "powf(0.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "powf(0.1, y)", z);
z = powf(1.1, y);
-
- if (isinf(z) == 0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(1.1, +Inf) != +Inf");
+ ATF_CHECK_MSG(isinf(z), "y=%a z=%s=%a", y, "powf(1.1, y)", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "y=%a z=%s=%a", y, "powf(1.1, y)", z);
}
ATF_TC(powf_one_neg_x);
@@ -490,24 +449,18 @@ ATF_TC_HEAD(powf_one_neg_x, tc)
ATF_TC_BODY(powf_one_neg_x, tc)
{
- const float infp = 1.0L / 0.0L;
- const float infn = -1.0L / 0.0L;
+ const volatile float infp = 1.0f / 0.0f;
+ const volatile float infn = -1.0f / 0.0f;
+ double z;
/*
* If x is -1.0, and y is +-Inf, 1.0 shall be returned.
*/
- ATF_REQUIRE(isinf(infp) != 0);
- ATF_REQUIRE(isinf(infn) != 0);
+ ATF_REQUIRE_MSG(isinf(infp), "infp=%a", infp);
+ ATF_REQUIRE_MSG(isinf(infn), "infn=%a", infn);
- if (powf(-1.0, infp) != 1.0) {
- atf_tc_expect_fail("PR lib/45372");
- atf_tc_fail_nonfatal("powf(-1.0, +Inf) != 1.0");
- }
-
- if (powf(-1.0, infn) != 1.0) {
- atf_tc_expect_fail("PR lib/45372");
- atf_tc_fail_nonfatal("powf(-1.0, -Inf) != 1.0");
- }
+ ATF_CHECK_EQ_MSG((z = powf(-1.0, infp)), 1.0, "z=%a", z);
+ ATF_CHECK_EQ_MSG((z = powf(-1.0, infn)), 1.0, "z=%a", z);
}
ATF_TC(powf_one_pos_x);
@@ -518,21 +471,22 @@ ATF_TC_HEAD(powf_one_pos_x, tc)
ATF_TC_BODY(powf_one_pos_x, tc)
{
- const float y[] = { 0.0, 0.1, 2.0, -3.0, 99.0, 99.99, 9999999.9 };
- const float z = 0.0L / 0.0L;
+ const volatile float y[] =
+ { 0.0, 0.1, 2.0, -3.0, 99.0, 99.99, 9999999.9 };
+ const volatile float z = 0.0f / 0.0f;
size_t i;
/*
* For any value of y (including NaN),
* if x is 1.0, 1.0 shall be returned.
*/
- if (powf(1.0, z) != 1.0)
- atf_tc_fail_nonfatal("powf(1.0, NaN) != 1.0");
+ ATF_CHECK_EQ_MSG(powf(1.0, z), 1.0, "z=%a powf(1.0, z)=%a",
+ z, powf(1.0, z));
for (i = 0; i < __arraycount(y); i++) {
-
- if (powf(1.0, y[i]) != 1.0)
- atf_tc_fail_nonfatal("powf(1.0, %0.01f) != 1.0", y[i]);
+ ATF_CHECK_EQ_MSG(powf(1.0, y[i]), 1.0,
+ "i=%zu y[i]=%a powf(1.0, y[i])=%a",
+ i, y[i], powf(1.0, y[i]));
}
}
@@ -551,58 +505,40 @@ ATF_TC_BODY(powf_zero_x, tc)
* is an odd integer, x is returned.
*/
z = powf(+0.0, 3.0);
-
- if (fabsf(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(+0.0, 3.0) != +0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "z=%a", z);
z = powf(-0.0, 3.0);
-
- if (fabsf(z) > 0.0 || signbit(z) == 0)
- atf_tc_fail_nonfatal("powf(-0.0, 3.0) != -0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) != 0, "z=%a", z);
/*
* If y > 0 and not an odd integer,
* if x is +0.0 or -0.0, +0.0 is returned.
*/
z = powf(+0.0, 4.0);
-
- if (fabsf(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(+0.0, 4.0) != +0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "z=%a", z);
z = powf(-0.0, 4.0);
-
- if (fabsf(z) > 0.0 || signbit(z) != 0)
- atf_tc_fail_nonfatal("powf(-0.0, 4.0) != +0.0");
+ ATF_CHECK_MSG(fabsf(z) == 0.0, "z=%a", z);
+ ATF_CHECK_MSG(signbit(z) == 0, "z=%a", z);
/*
* If y < 0 and x is +0.0 or -0.0, either +-HUGE_VAL,
* +-HUGE_VALF, or +-HUGE_VALL shall be returned.
*/
z = powf(+0.0, -4.0);
-
- if (z != HUGE_VALF) {
- atf_tc_expect_fail("PR port-amd64/45391");
- atf_tc_fail_nonfatal("powf(+0.0, -4.0) != HUGE_VALF");
- }
+ ATF_CHECK_EQ_MSG(z, HUGE_VALF, "z=%a", z);
z = powf(-0.0, -4.0);
-
- if (z != HUGE_VALF) {
- atf_tc_expect_fail("PR port-amd64/45391");
- atf_tc_fail_nonfatal("powf(-0.0, -4.0) != HUGE_VALF");
- }
+ ATF_CHECK_EQ_MSG(z, HUGE_VALF, "z=%a", z);
z = powf(+0.0, -5.0);
-
- if (z != HUGE_VALF) {
- atf_tc_expect_fail("PR port-amd64/45391");
- atf_tc_fail_nonfatal("powf(+0.0, -5.0) != HUGE_VALF");
- }
+ ATF_CHECK_EQ_MSG(z, HUGE_VALF, "z=%a", z);
z = powf(-0.0, -5.0);
-
- if (z != -HUGE_VALF)
- atf_tc_fail_nonfatal("powf(-0.0, -5.0) != -HUGE_VALF");
+ ATF_CHECK_EQ_MSG(z, -HUGE_VALF, "z=%a", z);
}
ATF_TC(powf_zero_y);
@@ -613,27 +549,24 @@ ATF_TC_HEAD(powf_zero_y, tc)
ATF_TC_BODY(powf_zero_y, tc)
{
- const float x[] = { 0.1, -3.0, 77.0, 99.99, 101.0000001 };
- const float z = 0.0L / 0.0L;
+ const volatile float x[] = { 0.1, -3.0, 77.0, 99.99, 101.0000001 };
+ const volatile float z = 0.0f / 0.0f;
size_t i;
/*
* For any value of x (including NaN),
* if y is +0.0 or -0.0, 1.0 is returned.
*/
- if (powf(z, +0.0) != 1.0)
- atf_tc_fail_nonfatal("powf(NaN, +0.0) != 1.0");
-
- if (powf(z, -0.0) != 1.0)
- atf_tc_fail_nonfatal("powf(NaN, -0.0) != 1.0");
+ ATF_CHECK_EQ_MSG(powf(z, +0.0), 1.0, "z=%a powf(z, +0.0)=%a",
+ z, powf(z, +0.0));
+ ATF_CHECK_EQ_MSG(powf(z, -0.0), 1.0, "z=%a powf(z, -0.0)=%a",
+ z, powf(z, -0.0));
for (i = 0; i < __arraycount(x); i++) {
-
- if (powf(x[i], +0.0) != 1.0)
- atf_tc_fail_nonfatal("powf(%0.01f, +0.0) != 1.0",x[i]);
-
- if (powf(x[i], -0.0) != 1.0)
- atf_tc_fail_nonfatal("powf(%0.01f, -0.0) != 1.0",x[i]);
+ ATF_CHECK_EQ_MSG(powf(x[i], +0.0), 1.0,
+ "i=%zu powf(%a, +0.0)=%a", i, x[i], powf(x[i], +0.0));
+ ATF_CHECK_EQ_MSG(powf(x[i], -0.0), 1.0,
+ "i=%zu powf(%a, -0.0)=%a", i, x[i], powf(x[i], -0.0));
}
}
diff --git a/lib/libm/t_precision.c b/lib/libm/t_precision.c
index df2d8a36e3f6..ccb63570bc3c 100644
--- a/lib/libm/t_precision.c
+++ b/lib/libm/t_precision.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_precision.c,v 1.3 2016/08/27 10:07:05 christos Exp $ */
+/* $NetBSD: t_precision.c,v 1.4 2024/05/06 15:46:31 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_precision.c,v 1.3 2016/08/27 10:07:05 christos Exp $");
+__RCSID("$NetBSD: t_precision.c,v 1.4 2024/05/06 15:46:31 riastradh Exp $");
#include <atf-c.h>
@@ -45,9 +45,7 @@ ATF_TC_HEAD(t_precision, tc)
}
volatile double x = 1;
-#if __HAVE_LONG_DOUBLE
volatile long double y = 1;
-#endif
ATF_TC_BODY(t_precision, tc)
{
@@ -60,7 +58,6 @@ ATF_TC_BODY(t_precision, tc)
x += DBL_EPSILON;
ATF_CHECK(x == 2.0);
-#if __HAVE_LONG_DOUBLE
y += LDBL_EPSILON;
ATF_CHECK(y != 1.0L);
y -= 1;
@@ -68,7 +65,6 @@ ATF_TC_BODY(t_precision, tc)
y = 2;
y += LDBL_EPSILON;
ATF_CHECK(y == 2.0L);
-#endif
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libm/t_round.c b/lib/libm/t_round.c
index a5a930599c79..1036efa29ab4 100644
--- a/lib/libm/t_round.c
+++ b/lib/libm/t_round.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_round.c,v 1.9 2017/09/03 13:41:19 wiz Exp $ */
+/* $NetBSD: t_round.c,v 1.10 2024/02/02 22:39:09 andvar Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
/*
* This tests for a bug in the initial implementation where
- * precision was lost in an internal substraction, leading to
+ * precision was lost in an internal subtraction, leading to
* rounding into the wrong direction.
*/
diff --git a/lib/libm/t_scalbn.c b/lib/libm/t_scalbn.c
index 2a0b51ae372e..dcea3186bcb5 100644
--- a/lib/libm/t_scalbn.c
+++ b/lib/libm/t_scalbn.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_scalbn.c,v 1.16 2018/11/07 03:59:36 riastradh Exp $ */
+/* $NetBSD: t_scalbn.c,v 1.18 2024/06/09 16:53:12 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_scalbn.c,v 1.16 2018/11/07 03:59:36 riastradh Exp $");
+__RCSID("$NetBSD: t_scalbn.c,v 1.18 2024/06/09 16:53:12 riastradh Exp $");
#include <math.h>
#include <limits.h>
@@ -376,9 +376,6 @@ ATF_TC_HEAD(scalbnl_val, tc)
ATF_TC_BODY(scalbnl_val, tc)
{
-#ifndef __HAVE_LONG_DOUBLE
- atf_tc_skip("Requires long double support");
-#else
const struct testcase *tests = test_vals;
const size_t tcnt = __arraycount(test_vals);
size_t i;
@@ -397,7 +394,6 @@ ATF_TC_BODY(scalbnl_val, tc)
i, rv, (long double)tests[i].result,
fabsl(((long double)tests[i].result - rv)/tests[i].result));
}
-#endif
}
ATF_TC(scalbnl_nan);
@@ -408,23 +404,16 @@ ATF_TC_HEAD(scalbnl_nan, tc)
ATF_TC_BODY(scalbnl_nan, tc)
{
-#ifndef __HAVE_LONG_DOUBLE
- atf_tc_skip("Requires long double support");
-#else
const long double x = 0.0L / 0.0L;
long double y;
size_t i;
- if (isnan(x) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("(0.0L / 0.0L) != NaN");
- }
+ ATF_CHECK_MSG(isnan(x), "x=%La", x);
for (i = 0; i < __arraycount(exps); i++) {
y = scalbnl(x, exps[i]);
- ATF_CHECK(isnan(y) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%La", y);
}
-#endif
}
ATF_TC(scalbnl_inf_neg);
@@ -435,15 +424,11 @@ ATF_TC_HEAD(scalbnl_inf_neg, tc)
ATF_TC_BODY(scalbnl_inf_neg, tc)
{
-#ifndef __HAVE_LONG_DOUBLE
- atf_tc_skip("Requires long double support");
-#else
const long double x = -1.0L / 0.0L;
size_t i;
for (i = 0; i < __arraycount(exps); i++)
ATF_CHECK(scalbnl(x, exps[i]) == x);
-#endif
}
ATF_TC(scalbnl_inf_pos);
@@ -454,15 +439,11 @@ ATF_TC_HEAD(scalbnl_inf_pos, tc)
ATF_TC_BODY(scalbnl_inf_pos, tc)
{
-#ifndef __HAVE_LONG_DOUBLE
- atf_tc_skip("Requires long double support");
-#else
const long double x = 1.0L / 0.0L;
size_t i;
for (i = 0; i < __arraycount(exps); i++)
ATF_CHECK(scalbnl(x, exps[i]) == x);
-#endif
}
ATF_TC(scalbnl_zero_neg);
@@ -473,9 +454,6 @@ ATF_TC_HEAD(scalbnl_zero_neg, tc)
ATF_TC_BODY(scalbnl_zero_neg, tc)
{
-#ifndef __HAVE_LONG_DOUBLE
- atf_tc_skip("Requires long double support");
-#else
const long double x = -0.0L;
long double y;
size_t i;
@@ -487,7 +465,6 @@ ATF_TC_BODY(scalbnl_zero_neg, tc)
ATF_CHECK(x == y);
ATF_CHECK(signbit(y) != 0);
}
-#endif
}
ATF_TC(scalbnl_zero_pos);
@@ -498,9 +475,6 @@ ATF_TC_HEAD(scalbnl_zero_pos, tc)
ATF_TC_BODY(scalbnl_zero_pos, tc)
{
-#ifndef __HAVE_LONG_DOUBLE
- atf_tc_skip("Requires long double support");
-#else
const long double x = 0.0L;
long double y;
size_t i;
@@ -512,7 +486,6 @@ ATF_TC_BODY(scalbnl_zero_pos, tc)
ATF_CHECK(x == y);
ATF_CHECK(signbit(y) == 0);
}
-#endif
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libm/t_sin.c b/lib/libm/t_sin.c
index ca581f03fad0..bbcca967ae50 100644
--- a/lib/libm/t_sin.c
+++ b/lib/libm/t_sin.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sin.c,v 1.7 2019/05/27 00:24:37 maya Exp $ */
+/* $NetBSD: t_sin.c,v 1.8 2024/06/09 16:53:12 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -117,9 +117,10 @@ ATF_TC_HEAD(sin_inf_neg, tc)
ATF_TC_BODY(sin_inf_neg, tc)
{
- const double x = -1.0L / 0.0L;
+ const volatile double x = -1.0 / 0.0;
+ const double y = sin(x);
- ATF_CHECK(isnan(sin(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
ATF_TC(sin_inf_pos);
@@ -130,9 +131,10 @@ ATF_TC_HEAD(sin_inf_pos, tc)
ATF_TC_BODY(sin_inf_pos, tc)
{
- const double x = 1.0L / 0.0L;
+ const volatile double x = 1.0 / 0.0;
+ const double y = sin(x);
- ATF_CHECK(isnan(sin(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
@@ -222,12 +224,10 @@ ATF_TC_HEAD(sinf_inf_neg, tc)
ATF_TC_BODY(sinf_inf_neg, tc)
{
- const float x = -1.0L / 0.0L;
+ const volatile float x = -1.0f / 0.0f;
+ const float y = sinf(x);
- if (isnan(sinf(x)) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("sinf(-Inf) != NaN");
- }
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
ATF_TC(sinf_inf_pos);
@@ -238,12 +238,10 @@ ATF_TC_HEAD(sinf_inf_pos, tc)
ATF_TC_BODY(sinf_inf_pos, tc)
{
- const float x = 1.0L / 0.0L;
+ const volatile float x = -1.0f / 0.0f;
+ const float y = sinf(x);
- if (isnan(sinf(x)) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("sinf(+Inf) != NaN");
- }
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
diff --git a/lib/libm/t_sincos.c b/lib/libm/t_sincos.c
index 68b1d094b3bd..0f6f90137845 100644
--- a/lib/libm/t_sincos.c
+++ b/lib/libm/t_sincos.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sincos.c,v 1.1 2022/08/27 08:31:58 christos Exp $ */
+/* $NetBSD: t_sincos.c,v 1.2 2024/05/06 15:53:46 riastradh Exp $ */
/*-
* Copyright (c) 2011, 2022 The NetBSD Foundation, Inc.
@@ -85,7 +85,6 @@ static const struct {
{ 360, 6.283185307179586, 1.0000000000000000, 999 },
};
-#ifdef __HAVE_LONG_DOUBLE
/*
* sincosl(3)
*/
@@ -207,7 +206,6 @@ ATF_TC_BODY(sincosl_zero_pos, tc)
sincosl(x, &s, &c);
ATF_CHECK(s == 0.0 && c == 1.0);
}
-#endif
/*
* sincos(3)
@@ -451,14 +449,13 @@ ATF_TC_BODY(sincosf_zero_pos, tc)
ATF_TP_ADD_TCS(tp)
{
-#ifdef __HAVE_LONG_DOUBLE
+
ATF_TP_ADD_TC(tp, sincosl_angles);
ATF_TP_ADD_TC(tp, sincosl_nan);
ATF_TP_ADD_TC(tp, sincosl_inf_neg);
ATF_TP_ADD_TC(tp, sincosl_inf_pos);
ATF_TP_ADD_TC(tp, sincosl_zero_neg);
ATF_TP_ADD_TC(tp, sincosl_zero_pos);
-#endif
ATF_TP_ADD_TC(tp, sincos_angles);
ATF_TP_ADD_TC(tp, sincos_nan);
diff --git a/lib/libm/t_tan.c b/lib/libm/t_tan.c
index 1bbc4b4d4c95..118ec35b97de 100644
--- a/lib/libm/t_tan.c
+++ b/lib/libm/t_tan.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_tan.c,v 1.7 2018/11/07 04:00:13 riastradh Exp $ */
+/* $NetBSD: t_tan.c,v 1.8 2024/06/09 16:53:12 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -113,9 +113,10 @@ ATF_TC_HEAD(tan_inf_neg, tc)
ATF_TC_BODY(tan_inf_neg, tc)
{
- const double x = -1.0L / 0.0L;
+ const volatile double x = -1.0 / 0.0;
+ const double y = tan(x);
- ATF_CHECK(isnan(tan(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
ATF_TC(tan_inf_pos);
@@ -126,9 +127,10 @@ ATF_TC_HEAD(tan_inf_pos, tc)
ATF_TC_BODY(tan_inf_pos, tc)
{
- const double x = 1.0L / 0.0L;
+ const volatile double x = 1.0 / 0.0;
+ const double y = tan(x);
- ATF_CHECK(isnan(tan(x)) != 0);
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
@@ -220,12 +222,10 @@ ATF_TC_HEAD(tanf_inf_neg, tc)
ATF_TC_BODY(tanf_inf_neg, tc)
{
- const float x = -1.0L / 0.0L;
+ const volatile float x = -1.0f / 0.0f;
+ const float y = tanf(x);
- if (isnan(tanf(x)) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("tanf(-Inf) != NaN");
- }
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
ATF_TC(tanf_inf_pos);
@@ -236,12 +236,10 @@ ATF_TC_HEAD(tanf_inf_pos, tc)
ATF_TC_BODY(tanf_inf_pos, tc)
{
- const float x = 1.0L / 0.0L;
+ const volatile float x = 1.0f / 0.0f;
+ const float y = tanf(x);
- if (isnan(tanf(x)) == 0) {
- atf_tc_expect_fail("PR lib/45362");
- atf_tc_fail("tanf(+Inf) != NaN");
- }
+ ATF_CHECK_MSG(isnan(y), "y=%a", y);
}
diff --git a/lib/libprop/t_proplib.c b/lib/libprop/t_proplib.c
index 6d276b8ff3fd..7a080557bb57 100644
--- a/lib/libprop/t_proplib.c
+++ b/lib/libprop/t_proplib.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_proplib.c,v 1.4 2020/06/24 14:28:10 thorpej Exp $ */
+/* $NetBSD: t_proplib.c,v 1.5 2025/09/23 22:35:40 rillig Exp $ */
/*
* Copyright (c) 2008, 2020 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008, 2020\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_proplib.c,v 1.4 2020/06/24 14:28:10 thorpej Exp $");
+__RCSID("$NetBSD: t_proplib.c,v 1.5 2025/09/23 22:35:40 rillig Exp $");
#include <limits.h>
#include <stdlib.h>
@@ -209,6 +209,60 @@ ATF_TC_BODY(prop_dictionary_equals, tc)
prop_object_release(d);
}
+ATF_TC(prop_dictionary_internalize_base64);
+ATF_TC_HEAD(prop_dictionary_internalize_base64, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test internalizing base64-encoded data");
+}
+
+ATF_TC_BODY(prop_dictionary_internalize_base64, tc)
+{
+
+ prop_dictionary_t dict = prop_dictionary_internalize(
+"<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
+"<plist version=\"1.0\">\n"
+"<dict>\n"
+" <key>encoded</key>\n"
+" <data>SGVsbG8sIHdvcmxkCg==</data>\n"
+" <key>length-1</key>\n"
+" <data>aQ==</data>\n"
+" <key>length-2</key>\n"
+" <data>aWk=</data>\n"
+" <key>length-3</key>\n"
+" <data>aWlp</data>\n"
+"</dict>\n"
+"</plist>\n");
+
+
+ ATF_REQUIRE(dict != NULL);
+
+ const void *data;
+ size_t size;
+ bool ok;
+
+ ok = prop_dictionary_get_data(dict, "encoded", &data, &size);
+ ATF_REQUIRE(ok);
+ ATF_CHECK_EQ(size, 13);
+ ATF_CHECK_EQ(memcmp(data, "Hello, world\n", 13), 0);
+
+ ok = prop_dictionary_get_data(dict, "length-1", &data, &size);
+ ATF_REQUIRE(ok);
+ ATF_CHECK_EQ(size, 1);
+ ATF_CHECK_EQ(memcmp(data, "i", 1), 0);
+
+ ok = prop_dictionary_get_data(dict, "length-2", &data, &size);
+ ATF_REQUIRE(ok);
+ ATF_CHECK_EQ(size, 2);
+ ATF_CHECK_EQ(memcmp(data, "ii", 2), 0);
+
+ ok = prop_dictionary_get_data(dict, "length-3", &data, &size);
+ ATF_REQUIRE(ok);
+ ATF_CHECK_EQ(size, 3);
+ ATF_CHECK_EQ(memcmp(data, "iii", 3), 0);
+
+ prop_object_release(dict);
+}
+
ATF_TC(prop_data_basic);
ATF_TC_HEAD(prop_data_basic, tc)
{
@@ -907,6 +961,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, prop_basic);
ATF_TP_ADD_TC(tp, prop_dictionary_equals);
+ ATF_TP_ADD_TC(tp, prop_dictionary_internalize_base64);
ATF_TP_ADD_TC(tp, prop_dict_util);
ATF_TP_ADD_TC(tp, prop_data_basic);
ATF_TP_ADD_TC(tp, prop_number_basic);
diff --git a/lib/libpthread/Makefile b/lib/libpthread/Makefile
index 6e689f263a1b..88dd8f2e380e 100644
--- a/lib/libpthread/Makefile
+++ b/lib/libpthread/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.15 2020/06/21 07:06:05 lukem Exp $
+# $NetBSD: Makefile,v 1.22 2025/10/18 20:27:23 riastradh Exp $
NOMAN= # defined
@@ -17,6 +17,8 @@ CPPFLAGS.t_condwait.c+= -I${.CURDIR}/../libc/gen
TESTS_SH+= t_atexit
TESTS_C+= t_barrier
TESTS_SH+= t_cancel
+TESTS_C+= t_cancellation
+TESTS_C+= t_compat_cancel
TESTS_C+= t_cond
TESTS_C+= t_condwait
TESTS_C+= t_detach
@@ -37,11 +39,17 @@ TESTS_C+= t_sigmask
TESTS_C+= t_sigsuspend
TESTS_C+= t_siglongjmp
TESTS_C+= t_sleep
+TESTS_C+= t_stack
TESTS_C+= t_swapcontext
TESTS_SH+= t_thread_local_dtor
TESTS_C+= t_timedmutex
LDADD.t_sem+= -lrt
+LDADD.t_cancellation+= -lrt
+LDADD.t_compat_cancel+= -lrt
+CPPFLAGS.t_compat_cancel.c+= -I${NETBSDSRCDIR}/lib/libc
+CPPFLAGS.t_compat_cancel.c+= -I${NETBSDSRCDIR}/sys
+LDFLAGS.t_compat_cancel+= -Wl,--no-fatal-warnings # intend compat use
BINDIR= ${TESTSDIR}
PROGS= h_atexit
@@ -60,6 +68,7 @@ SRCS.h_thread_local_dtor= h_thread_local_dtor.cpp
FILESDIR= ${TESTSDIR}
FILES= d_mach
-SUBDIR= dlopen
+TESTS_SUBDIRS+= dlopen
+TESTS_SUBDIRS+= weak
.include <bsd.test.mk>
diff --git a/lib/libpthread/dlopen/t_dlopen.c b/lib/libpthread/dlopen/t_dlopen.c
index 68e983585431..fc7e5f831582 100644
--- a/lib/libpthread/dlopen/t_dlopen.c
+++ b/lib/libpthread/dlopen/t_dlopen.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_dlopen.c,v 1.1 2013/03/21 16:50:21 christos Exp $ */
+/* $NetBSD: t_dlopen.c,v 1.3 2025/11/23 22:11:41 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,28 +32,22 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_dlopen.c,v 1.1 2013/03/21 16:50:21 christos Exp $");
+__RCSID("$NetBSD: t_dlopen.c,v 1.3 2025/11/23 22:11:41 riastradh Exp $");
#include <atf-c.h>
#include <dlfcn.h>
#include <pthread.h>
+#include <signal.h>
#include <unistd.h>
-ATF_TC(dlopen);
-
-ATF_TC_HEAD(dlopen, tc)
-{
- atf_tc_set_md_var(tc, "descr",
- "Test if dlopen can load -lpthread DSO");
-}
-
#define DSO TESTDIR "/h_pthread_dlopen.so"
-ATF_TC_BODY(dlopen, tc)
+static void
+test_dlopen(int flags)
{
void *handle;
int (*testf_dso_null)(void);
- handle = dlopen(DSO, RTLD_NOW | RTLD_LOCAL);
+ handle = dlopen(DSO, flags);
ATF_REQUIRE_MSG(handle != NULL, "dlopen fails: %s", dlerror());
testf_dso_null = dlsym(handle, "testf_dso_null");
@@ -64,15 +58,30 @@ ATF_TC_BODY(dlopen, tc)
ATF_REQUIRE(dlclose(handle) == 0);
}
-ATF_TC(dlopen_mutex);
+ATF_TC(dlopen);
+ATF_TC_HEAD(dlopen, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test if dlopen can load -lpthread DSO");
+}
+ATF_TC_BODY(dlopen, tc)
+{
+ test_dlopen(RTLD_NOW | RTLD_LOCAL);
+}
-ATF_TC_HEAD(dlopen_mutex, tc)
+ATF_TC(dlopen_lazyglobal);
+ATF_TC_HEAD(dlopen_lazyglobal, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Test if dlopen can load -lpthread DSO without breaking mutex");
+ "Test if dlopen can load -lpthread DSO");
+}
+ATF_TC_BODY(dlopen_lazyglobal, tc)
+{
+ test_dlopen(RTLD_LAZY | RTLD_GLOBAL);
}
-ATF_TC_BODY(dlopen_mutex, tc)
+static void
+test_dlopen_mutex(int flags)
{
pthread_mutex_t mtx;
void *handle;
@@ -81,7 +90,7 @@ ATF_TC_BODY(dlopen_mutex, tc)
ATF_REQUIRE(pthread_mutex_init(&mtx, NULL) == 0);
ATF_REQUIRE(pthread_mutex_lock(&mtx) == 0);
- handle = dlopen(DSO, RTLD_NOW | RTLD_LOCAL);
+ handle = dlopen(DSO, flags);
ATF_REQUIRE_MSG(handle != NULL, "dlopen fails: %s", dlerror());
testf_dso_null = dlsym(handle, "testf_dso_null");
@@ -93,18 +102,36 @@ ATF_TC_BODY(dlopen_mutex, tc)
ATF_REQUIRE(dlclose(handle) == 0);
+ ATF_REQUIRE(pthread_mutex_lock(&mtx) == 0);
+ ATF_REQUIRE(pthread_mutex_unlock(&mtx) == 0);
+
pthread_mutex_destroy(&mtx);
}
-ATF_TC(dlopen_mutex_libc);
+ATF_TC(dlopen_mutex);
+ATF_TC_HEAD(dlopen_mutex, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test if dlopen can load -lpthread DSO without breaking mutex");
+}
+ATF_TC_BODY(dlopen_mutex, tc)
+{
+ test_dlopen_mutex(RTLD_NOW | RTLD_LOCAL);
+}
-ATF_TC_HEAD(dlopen_mutex_libc, tc)
+ATF_TC(dlopen_mutex_lazyglobal);
+ATF_TC_HEAD(dlopen_mutex_lazyglobal, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Test if dlopen can load -lpthread DSO and use libc locked mutex");
+ "Test if dlopen can load -lpthread DSO without breaking mutex");
+}
+ATF_TC_BODY(dlopen_mutex_lazyglobal, tc)
+{
+ test_dlopen_mutex(RTLD_LAZY | RTLD_GLOBAL);
}
-ATF_TC_BODY(dlopen_mutex_libc, tc)
+static void
+test_dlopen_mutex_libc(int flags)
{
pthread_mutex_t mtx;
void *handle;
@@ -113,7 +140,7 @@ ATF_TC_BODY(dlopen_mutex_libc, tc)
ATF_REQUIRE(pthread_mutex_init(&mtx, NULL) == 0);
ATF_REQUIRE(pthread_mutex_lock(&mtx) == 0);
- handle = dlopen(DSO, RTLD_NOW | RTLD_LOCAL);
+ handle = dlopen(DSO, flags);
ATF_REQUIRE_MSG(handle != NULL, "dlopen fails: %s", dlerror());
testf_dso_mutex_unlock = dlsym(handle, "testf_dso_mutex_unlock");
@@ -124,19 +151,36 @@ ATF_TC_BODY(dlopen_mutex_libc, tc)
dlclose(handle);
+ ATF_REQUIRE(pthread_mutex_lock(&mtx) == 0);
+ ATF_REQUIRE(pthread_mutex_unlock(&mtx) == 0);
+
pthread_mutex_destroy(&mtx);
}
-ATF_TC(dlopen_mutex_libpthread);
+ATF_TC(dlopen_mutex_libc);
+ATF_TC_HEAD(dlopen_mutex_libc, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test if dlopen can load -lpthread DSO and use libc locked mutex");
+}
+ATF_TC_BODY(dlopen_mutex_libc, tc)
+{
+ test_dlopen_mutex_libc(RTLD_NOW | RTLD_LOCAL);
+}
-ATF_TC_HEAD(dlopen_mutex_libpthread, tc)
+ATF_TC(dlopen_mutex_libc_lazyglobal);
+ATF_TC_HEAD(dlopen_mutex_libc_lazyglobal, tc)
{
atf_tc_set_md_var(tc, "descr",
- "Test if dlopen can load -lpthread DSO and use "
- "libpthread locked mutex");
+ "Test if dlopen can load -lpthread DSO and use libc locked mutex");
+}
+ATF_TC_BODY(dlopen_mutex_libc_lazyglobal, tc)
+{
+ test_dlopen_mutex_libc(RTLD_LAZY | RTLD_GLOBAL);
}
-ATF_TC_BODY(dlopen_mutex_libpthread, tc)
+static void
+test_dlopen_mutex_libpthread(int flags)
{
pthread_mutex_t mtx;
void *handle;
@@ -144,7 +188,7 @@ ATF_TC_BODY(dlopen_mutex_libpthread, tc)
ATF_REQUIRE(pthread_mutex_init(&mtx, NULL) == 0);
- handle = dlopen(DSO, RTLD_NOW | RTLD_LOCAL);
+ handle = dlopen(DSO, flags);
ATF_REQUIRE_MSG(handle != NULL, "dlopen fails: %s", dlerror());
testf_dso_mutex_lock = dlsym(handle, "testf_dso_mutex_lock");
@@ -157,15 +201,48 @@ ATF_TC_BODY(dlopen_mutex_libpthread, tc)
dlclose(handle);
+ ATF_REQUIRE(pthread_mutex_lock(&mtx) == 0);
+ ATF_REQUIRE(pthread_mutex_unlock(&mtx) == 0);
+
pthread_mutex_destroy(&mtx);
}
+ATF_TC(dlopen_mutex_libpthread);
+ATF_TC_HEAD(dlopen_mutex_libpthread, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test if dlopen can load -lpthread DSO and use "
+ "libpthread locked mutex");
+}
+ATF_TC_BODY(dlopen_mutex_libpthread, tc)
+{
+ test_dlopen_mutex_libpthread(RTLD_NOW | RTLD_LOCAL);
+}
+
+ATF_TC(dlopen_mutex_libpthread_lazyglobal);
+ATF_TC_HEAD(dlopen_mutex_libpthread_lazyglobal, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Test if dlopen can load -lpthread DSO and use "
+ "libpthread locked mutex");
+}
+ATF_TC_BODY(dlopen_mutex_libpthread_lazyglobal, tc)
+{
+ test_dlopen_mutex_libpthread(RTLD_LAZY | RTLD_GLOBAL);
+}
+
ATF_TP_ADD_TCS(tp)
{
+
ATF_TP_ADD_TC(tp, dlopen);
ATF_TP_ADD_TC(tp, dlopen_mutex);
ATF_TP_ADD_TC(tp, dlopen_mutex_libc);
ATF_TP_ADD_TC(tp, dlopen_mutex_libpthread);
+ ATF_TP_ADD_TC(tp, dlopen_lazyglobal);
+ ATF_TP_ADD_TC(tp, dlopen_mutex_lazyglobal);
+ ATF_TP_ADD_TC(tp, dlopen_mutex_libc_lazyglobal);
+ ATF_TP_ADD_TC(tp, dlopen_mutex_libpthread_lazyglobal);
+
return atf_no_error();
}
diff --git a/lib/libpthread/dlopen/t_dso_pthread_create.c b/lib/libpthread/dlopen/t_dso_pthread_create.c
index ab8bec32a8ab..93eee37e2dbc 100644
--- a/lib/libpthread/dlopen/t_dso_pthread_create.c
+++ b/lib/libpthread/dlopen/t_dso_pthread_create.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_dso_pthread_create.c,v 1.1 2013/03/21 16:50:21 christos Exp $ */
+/* $NetBSD: t_dso_pthread_create.c,v 1.2 2025/11/22 20:05:20 riastradh Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -32,14 +32,17 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_dso_pthread_create.c,v 1.1 2013/03/21 16:50:21 christos Exp $");
+__RCSID("$NetBSD: t_dso_pthread_create.c,v 1.2 2025/11/22 20:05:20 riastradh Exp $");
-#include <sys/resource.h>
#include <atf-c.h>
#include <dlfcn.h>
#include <pthread.h>
+#include <setjmp.h>
+#include <signal.h>
#include <unistd.h>
+#include "../../../h_macros.h"
+
#define DSO TESTDIR "/h_pthread_dlopen.so"
void *
@@ -49,6 +52,17 @@ routine(void *arg)
return NULL;
}
+static jmp_buf abort_aborting;
+
+static void
+handle_sigabrt(int signo)
+{
+
+ ATF_REQUIRE_EQ_MSG(signo, SIGABRT, "signo=%d (%s)", signo,
+ strsignal(signo));
+ longjmp(abort_aborting, 1);
+}
+
ATF_TC(dso_pthread_create_dso);
ATF_TC_HEAD(dso_pthread_create_dso, tc)
@@ -64,25 +78,26 @@ ATF_TC_BODY(dso_pthread_create_dso, tc)
pthread_t thread;
void *arg = (void *)0xcafe;
void *handle;
- int (*testf_dso_pthread_create)(pthread_t *, pthread_attr_t *,
+ int (*testf_dso_pthread_create)(pthread_t *, pthread_attr_t *,
void *(*)(void *), void *);
- struct rlimit rl;
-
- atf_tc_expect_signal(6,
- "calling pthread_create() requires -lpthread main");
-
- rl.rlim_max = rl.rlim_cur = 0;
- ATF_REQUIRE_EQ(setrlimit(RLIMIT_CORE, &rl), 0);
+ void (*sighandler)(int);
handle = dlopen(DSO, RTLD_NOW | RTLD_LOCAL);
ATF_REQUIRE_MSG(handle != NULL, "dlopen fails: %s", dlerror());
testf_dso_pthread_create = dlsym(handle, "testf_dso_pthread_create");
- ATF_REQUIRE_MSG(testf_dso_pthread_create != NULL,
+ ATF_REQUIRE_MSG(testf_dso_pthread_create != NULL,
"dlsym fails: %s", dlerror());
- ret = testf_dso_pthread_create(&thread, NULL, routine, arg);
- ATF_REQUIRE(ret == 0);
+ REQUIRE_LIBC((sighandler = signal(SIGABRT, &handle_sigabrt)), SIG_ERR);
+ if (setjmp(abort_aborting) == 0) {
+ ret = testf_dso_pthread_create(&thread, NULL, routine, arg);
+ } else {
+ ret = ENOSYS;
+ }
+ REQUIRE_LIBC(signal(SIGABRT, sighandler), SIG_ERR);
+ ATF_REQUIRE_MSG(ret != 0,
+ "pthread_create unexpectedly succeeded");
ATF_REQUIRE(dlclose(handle) == 0);
diff --git a/lib/libpthread/t_once.c b/lib/libpthread/t_once.c
index 650f3ee68dfd..add6f07cc9da 100644
--- a/lib/libpthread/t_once.c
+++ b/lib/libpthread/t_once.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_once.c,v 1.2 2017/08/25 22:59:47 ginsbach Exp $ */
+/* $NetBSD: t_once.c,v 1.3 2025/03/30 23:03:06 riastradh Exp $ */
/*
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,17 +29,21 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_once.c,v 1.2 2017/08/25 22:59:47 ginsbach Exp $");
+__RCSID("$NetBSD: t_once.c,v 1.3 2025/03/30 23:03:06 riastradh Exp $");
#include <sys/time.h>
+#include <sys/wait.h>
+
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
+#include <unistd.h>
#include <atf-c.h>
#include "h_common.h"
+#include "h_macros.h"
static pthread_once_t once = PTHREAD_ONCE_INIT;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -54,6 +58,12 @@ ofunc(void)
x++;
}
+static void
+ofunc_silent(void)
+{
+ x++;
+}
+
ATF_TC(once1);
ATF_TC_HEAD(once1, tc)
{
@@ -187,11 +197,75 @@ ATF_TC_BODY(once3, tc)
printf("Test succeeded\n");
}
+static long trial;
+
+static void *
+fork_and_once(void *cookie)
+{
+ pthread_barrier_t *bar = cookie;
+ pid_t pid, child;
+ int status;
+
+ (void)pthread_barrier_wait(bar);
+ RL(pid = fork());
+ if (pid == 0) {
+ (void)alarm(1);
+ (void)pthread_once(&once, &ofunc_silent);
+ _exit(x - 1);
+ }
+ RL(child = waitpid(pid, &status, 0));
+ ATF_REQUIRE_EQ_MSG(child, pid, "child=%lld pid=%lld",
+ (long long)child, (long long)pid);
+ ATF_REQUIRE_MSG(!WIFSIGNALED(status),
+ "child exited on signal %d (%s) in trial %ld",
+ WTERMSIG(status), strsignal(WTERMSIG(status)), trial);
+ ATF_REQUIRE_MSG(WIFEXITED(status) && WEXITSTATUS(status) == 0,
+ "child exited 0x%x in trial %ld", status, trial);
+ return NULL;
+}
+
+ATF_TC(oncefork);
+ATF_TC_HEAD(oncefork, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Test racing pthread_once with fork");
+}
+ATF_TC_BODY(oncefork, tc)
+{
+ static pthread_once_t once0 = PTHREAD_ONCE_INIT;
+ pthread_barrier_t bar;
+ long ntrials = atf_tc_get_config_var_as_long_wd(tc,
+ "pthread_once_forktrials", 0);
+
+ if (ntrials <= 0) {
+ atf_tc_skip("pthread_once takes thousands of fork trials"
+ " on a multicore system to detect a race; set"
+ " pthread_once_forktrials to the number of trials to"
+ " enable this test");
+ }
+
+ RZ(pthread_barrier_init(&bar, NULL, 2));
+
+ for (trial = 0; trial < ntrials; trial++) {
+ pthread_t t;
+
+ once = once0;
+ x = 0;
+
+ RZ(pthread_create(&t, NULL, &fork_and_once, &bar));
+ (void)alarm(1);
+ (void)pthread_barrier_wait(&bar);
+ (void)pthread_once(&once, &ofunc_silent);
+ (void)alarm(0);
+ RZ(pthread_join(t, NULL));
+ }
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, once1);
ATF_TP_ADD_TC(tp, once2);
ATF_TP_ADD_TC(tp, once3);
+ ATF_TP_ADD_TC(tp, oncefork);
return atf_no_error();
}
diff --git a/lib/librefuse/t_refuse_opt.c b/lib/librefuse/t_refuse_opt.c
index 7da65d4a9ee7..0c83011666c8 100644
--- a/lib/librefuse/t_refuse_opt.c
+++ b/lib/librefuse/t_refuse_opt.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_refuse_opt.c,v 1.9 2021/12/04 06:42:39 pho Exp $ */
+/* $NetBSD: t_refuse_opt.c,v 1.10 2023/11/24 17:31:03 riastradh Exp $ */
/*-
* Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -26,7 +26,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_refuse_opt.c,v 1.9 2021/12/04 06:42:39 pho Exp $");
+__RCSID("$NetBSD: t_refuse_opt.c,v 1.10 2023/11/24 17:31:03 riastradh Exp $");
#include <sys/types.h>
@@ -47,8 +47,8 @@ ATF_TC_BODY(t_fuse_opt_add_arg, tc)
{
struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
- RZ(fuse_opt_add_arg(&args, "foo"));
- RZ(fuse_opt_add_arg(&args, "bar"));
+ RL(fuse_opt_add_arg(&args, "foo"));
+ RL(fuse_opt_add_arg(&args, "bar"));
ATF_REQUIRE_EQ(args.argc, 2);
ATF_CHECK_STREQ(args.argv[0], "foo");
@@ -66,8 +66,8 @@ ATF_TC_BODY(t_fuse_opt_insert_arg, tc)
{
struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
- RZ(fuse_opt_insert_arg(&args, 0, "foo"));
- RZ(fuse_opt_insert_arg(&args, 0, "bar"));
+ RL(fuse_opt_insert_arg(&args, 0, "foo"));
+ RL(fuse_opt_insert_arg(&args, 0, "bar"));
ATF_REQUIRE_EQ(args.argc, 2);
ATF_CHECK_STREQ(args.argv[0], "bar");
@@ -85,10 +85,10 @@ ATF_TC_BODY(t_fuse_opt_add_opt, tc)
{
char* opt = NULL;
- RZ(fuse_opt_add_opt(&opt, "fo\\o"));
+ RL(fuse_opt_add_opt(&opt, "fo\\o"));
ATF_CHECK_STREQ(opt, "fo\\o");
- RZ(fuse_opt_add_opt(&opt, "ba,r"));
+ RL(fuse_opt_add_opt(&opt, "ba,r"));
ATF_CHECK_STREQ(opt, "fo\\o,ba,r");
}
@@ -102,10 +102,10 @@ ATF_TC_BODY(t_fuse_opt_add_opt_escaped, tc)
{
char* opt = NULL;
- RZ(fuse_opt_add_opt_escaped(&opt, "fo\\o"));
+ RL(fuse_opt_add_opt_escaped(&opt, "fo\\o"));
ATF_CHECK_STREQ(opt, "fo\\\\o");
- RZ(fuse_opt_add_opt_escaped(&opt, "ba,r"));
+ RL(fuse_opt_add_opt_escaped(&opt, "ba,r"));
ATF_CHECK_STREQ(opt, "fo\\\\o,ba\\,r");
}
@@ -207,10 +207,10 @@ ATF_TC_BODY(t_fuse_opt_parse_null_opts, tc)
struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
struct foofs_config config;
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "-o"));
- RZ(fuse_opt_add_arg(&args, "number=1,string=foo"));
- RZ(fuse_opt_add_arg(&args, "bar"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "-o"));
+ RL(fuse_opt_add_arg(&args, "number=1,string=foo"));
+ RL(fuse_opt_add_arg(&args, "bar"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, NULL, NULL) == 0);
@@ -236,10 +236,10 @@ ATF_TC_BODY(t_fuse_opt_parse_null_proc, tc)
struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
struct foofs_config config;
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "-o"));
- RZ(fuse_opt_add_arg(&args, "number=1,string=foo"));
- RZ(fuse_opt_add_arg(&args, "bar"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "-o"));
+ RL(fuse_opt_add_arg(&args, "number=1,string=foo"));
+ RL(fuse_opt_add_arg(&args, "bar"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, NULL) == 0);
@@ -264,10 +264,10 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* Standard form */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "-o"));
- RZ(fuse_opt_add_arg(&args, "number=1,string=foo"));
- RZ(fuse_opt_add_arg(&args, "bar"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "-o"));
+ RL(fuse_opt_add_arg(&args, "number=1,string=foo"));
+ RL(fuse_opt_add_arg(&args, "bar"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -279,9 +279,9 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* Concatenated -o */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "-onumber=1,unknown,string=foo"));
- RZ(fuse_opt_add_arg(&args, "bar"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "-onumber=1,unknown,string=foo"));
+ RL(fuse_opt_add_arg(&args, "bar"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -295,15 +295,15 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* Sparse -o */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "bar"));
- RZ(fuse_opt_add_arg(&args, "baz"));
- RZ(fuse_opt_add_arg(&args, "-o"));
- RZ(fuse_opt_add_arg(&args, "number=1"));
- RZ(fuse_opt_add_arg(&args, "-o"));
- RZ(fuse_opt_add_arg(&args, "unknown"));
- RZ(fuse_opt_add_arg(&args, "-o"));
- RZ(fuse_opt_add_arg(&args, "string=foo"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "bar"));
+ RL(fuse_opt_add_arg(&args, "baz"));
+ RL(fuse_opt_add_arg(&args, "-o"));
+ RL(fuse_opt_add_arg(&args, "number=1"));
+ RL(fuse_opt_add_arg(&args, "-o"));
+ RL(fuse_opt_add_arg(&args, "unknown"));
+ RL(fuse_opt_add_arg(&args, "-o"));
+ RL(fuse_opt_add_arg(&args, "string=foo"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -318,9 +318,9 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* Separate -n %i */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "-n"));
- RZ(fuse_opt_add_arg(&args, "3"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "-n"));
+ RL(fuse_opt_add_arg(&args, "3"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -332,8 +332,8 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* Concatenated -n %i */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "-n3"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "-n3"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -345,9 +345,9 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* -o constant */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "-o"));
- RZ(fuse_opt_add_arg(&args, "number2"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "-o"));
+ RL(fuse_opt_add_arg(&args, "number2"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -359,8 +359,8 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* -x constant */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "--number=four"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "--number=four"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -372,10 +372,10 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* end-of-options "--" marker */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "--"));
- RZ(fuse_opt_add_arg(&args, "-onumber=1"));
- RZ(fuse_opt_add_arg(&args, "-ostring=foo"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "--"));
+ RL(fuse_opt_add_arg(&args, "-onumber=1"));
+ RL(fuse_opt_add_arg(&args, "-ostring=foo"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
@@ -389,9 +389,9 @@ ATF_TC_BODY(t_fuse_opt_parse, tc)
/* The "--" marker at the last of outargs should be removed */
fuse_opt_free_args(&args);
- RZ(fuse_opt_add_arg(&args, "foofs"));
- RZ(fuse_opt_add_arg(&args, "--"));
- RZ(fuse_opt_add_arg(&args, "-onumber=1"));
+ RL(fuse_opt_add_arg(&args, "foofs"));
+ RL(fuse_opt_add_arg(&args, "--"));
+ RL(fuse_opt_add_arg(&args, "-onumber=1"));
memset(&config, 0, sizeof(config));
ATF_CHECK(fuse_opt_parse(&args, &config, foofs_opts, foo_opt_proc) == 0);
diff --git a/lib/librumpclient/t_exec.sh b/lib/librumpclient/t_exec.sh
index b933a7e7b6c5..0c469bd5d50a 100644
--- a/lib/librumpclient/t_exec.sh
+++ b/lib/librumpclient/t_exec.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_exec.sh,v 1.12 2020/11/08 08:54:50 martin Exp $
+# $NetBSD: t_exec.sh,v 1.13 2025/04/06 14:07:07 riastradh Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -41,6 +41,9 @@ noexec_body()
atf_check -s exit:0 ${rumpsrv} ${RUMP_SERVER}
atf_check -s exit:0 env $(atf_get_srcdir)/h_exec
atf_check -s exit:0 -o save:sstat.out rump.sockstat -n
+ echo '# begin sstat.out'
+ cat sstat.out
+ echo '# end sstat.out'
atf_check -s exit:0 -o match:'^root.*h_exec.*tcp.*\*\.1234' \
sed -n 2p sstat.out
atf_check -s exit:0 -o match:'^root.*h_exec.*tcp.*\*\.2345' \
@@ -64,6 +67,9 @@ exec_body()
atf_check -s exit:0 ${rumpsrv} ${RUMP_SERVER}
atf_check -s exit:0 $(atf_get_srcdir)/h_exec $(atf_get_srcdir)/h_exec
atf_check -s exit:0 -o save:sstat.out rump.sockstat -n
+ echo '# begin sstat.out'
+ cat sstat.out
+ echo '# end sstat.out'
atf_check -s exit:0 -o match:'^root.*h_ution.*tcp.*\*\.1234' \
sed -n 2p sstat.out
atf_check -s exit:0 -o match:'^root.*h_ution.*tcp.*\*\.2345' \
@@ -88,6 +94,9 @@ cloexec_body()
atf_check -s exit:0 \
$(atf_get_srcdir)/h_exec $(atf_get_srcdir)/h_exec cloexec1
atf_check -s exit:0 -o save:sstat.out rump.sockstat -n
+ echo '# begin sstat.out'
+ cat sstat.out
+ echo '# end sstat.out'
atf_check -s exit:0 -o inline:'2\n' sed -n '$=' sstat.out
atf_check -s exit:0 -o match:'^root.*h_ution.*tcp.*\*\.2345' \
sed -n 2p sstat.out
@@ -111,6 +120,9 @@ vfork_body()
atf_check -s exit:0 \
$(atf_get_srcdir)/h_exec $(atf_get_srcdir)/h_exec vfork_please
atf_check -s exit:0 -o save:sstat.out rump.sockstat -n
+ echo '# begin sstat.out'
+ cat sstat.out
+ echo '# end sstat.out'
atf_check -s exit:0 -o inline:'5\n' sed -n '$=' sstat.out
atf_check -s exit:0 -o match:'^root.*h_ution.*tcp.*\*\.1234' \
cat sstat.out
diff --git a/lib/librumpclient/t_fd.c b/lib/librumpclient/t_fd.c
index 140e50c7c176..1526374f9df6 100644
--- a/lib/librumpclient/t_fd.c
+++ b/lib/librumpclient/t_fd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_fd.c,v 1.8 2023/08/03 20:45:50 andvar Exp $ */
+/* $NetBSD: t_fd.c,v 1.9 2023/11/24 17:31:03 riastradh Exp $ */
/*
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@ ATF_TC_BODY(bigenough, tc)
{
struct stat sb;
- RZ(system("rump_server " RUMPSERV));
+ RL(system("rump_server " RUMPSERV));
RL(setenv("RUMP_SERVER", RUMPSERV, 1));
RL(dup2(0, 10));
@@ -109,7 +109,7 @@ ATF_TC_BODY(sigio, tc)
int sc;
signal(SIGIO, gotsig);
- RZ(system("rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet "
+ RL(system("rump_server -lrumpnet -lrumpnet_net -lrumpnet_netinet "
RUMPSERV));
RL(setenv("RUMP_SERVER", RUMPSERV, 1));
diff --git a/lib/librumphijack/t_tcpip.sh b/lib/librumphijack/t_tcpip.sh
index ea5ca958750f..19b923da9542 100644
--- a/lib/librumphijack/t_tcpip.sh
+++ b/lib/librumphijack/t_tcpip.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_tcpip.sh,v 1.23 2023/08/05 13:13:37 riastradh Exp $
+# $NetBSD: t_tcpip.sh,v 1.26 2025/04/25 22:51:29 riastradh Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -88,12 +88,12 @@ start_sshd() {
cp $(atf_get_srcdir)/ssh_host_key .
atf_check -s ignore -o empty -e ignore \
cp $(atf_get_srcdir)/ssh_host_key.pub .
- atf_check -s eq:0 -o empty -e empty chmod 400 ssh_host_key
- atf_check -s eq:0 -o empty -e empty chmod 444 ssh_host_key.pub
+ atf_check -s exit:0 -o empty -e empty chmod 400 ssh_host_key
+ atf_check -s exit:0 -o empty -e empty chmod 444 ssh_host_key.pub
# Start in debugging mode so we don't have parent<->child privsep stuff
env LD_PRELOAD=/usr/lib/librumphijack.so \
- /usr/sbin/sshd -d -e -E out -f ./sshd_config &
+ /usr/sbin/sshd -d -e -E "$(pwd)/out" -f ./sshd_config &
# while [ ! -f sshd.pid ]; do
# sleep 0.01
# done
@@ -101,14 +101,14 @@ start_sshd() {
sleep 1
echo "Setting up SSH client configuration"
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
ssh-keygen -f ssh_user_key -t rsa -b 1024 -N "" -q
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
cp ssh_user_key.pub authorized_keys
echo "127.0.0.1,localhost,::1 " \
"$(cat $(atf_get_srcdir)/ssh_host_key.pub)" >known_hosts || \
atf_fail "Failed to create known_hosts"
- atf_check -s eq:0 -o empty -e empty chmod 600 authorized_keys
+ atf_check -s exit:0 -o empty -e empty chmod 600 authorized_keys
sed -e "s,@SRCDIR@,$(atf_get_srcdir),g" -e "s,@WORKDIR@,$(pwd),g" \
$(atf_get_srcdir)/ssh_config.in >ssh_config || \
atf_fail "Failed to create ssh_config"
@@ -137,6 +137,25 @@ ssh_body()
jot 11 12 | xargs mkdir
cd ..
+ # From the PR (https://gnats.NetBSD.org/59278):
+ #
+ # > The LDAP problem has been fixed, but the new sshd-session
+ # > wants to exec sshd-auth with stdin/out the network socket so the
+ # > hijack code tries to dup(128, 0) and fails in:
+ # >
+ # > if (fd_isrump(oldd)) {
+ # > int (*op_close)(int) = GETSYSCALL(host, CLOSE);
+ # >
+ # > /* only allow fd 0-2 for cross-kernel dup */
+ # > if (!(newd >= 0 && newd <= 2 && !fd_isrump(newd))) {
+ # > errno = EBADF; <-----
+ # > return -1;
+ # > }
+ # >
+ # > The server client portion of the test works without rump...
+ #
+ atf_expect_fail "PR bin/59278: failing since openssh 10.0 update"
+
# ignore stderr for now, prints environment in debug mode
atf_check -s exit:0 -o save:ssh.out -e ignore \
env LD_PRELOAD=/usr/lib/librumphijack.so \
diff --git a/lib/libutil/Makefile b/lib/libutil/Makefile
index eaef6279a0e2..0b8568ab7a7a 100644
--- a/lib/libutil/Makefile
+++ b/lib/libutil/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.4 2011/03/30 17:02:17 jruoho Exp $
+# $NetBSD: Makefile,v 1.5 2025/05/02 19:52:02 rillig Exp $
NOMAN= # defined
@@ -14,6 +14,7 @@ TESTS_C+= t_parsedate
TESTS_C+= t_pidfile
TESTS_C+= t_snprintb
TESTS_C+= t_sockaddr_snprintf
+TESTS_C+= t_strpct
.if (${USE_INET6} != "no")
CFLAGS+= -DINET6
diff --git a/lib/libutil/t_snprintb.c b/lib/libutil/t_snprintb.c
index 5a7038901f24..34bdd3fe7425 100644
--- a/lib/libutil/t_snprintb.c
+++ b/lib/libutil/t_snprintb.c
@@ -1,10 +1,11 @@
-/* $NetBSD: t_snprintb.c,v 1.8 2019/12/08 17:37:16 christos Exp $ */
+/* $NetBSD: t_snprintb.c,v 1.39 2025/10/09 18:51:41 rillig Exp $ */
/*
- * Copyright (c) 2002, 2004, 2008, 2010 The NetBSD Foundation, Inc.
+ * Copyright (c) 2002, 2004, 2008, 2010, 2024 The NetBSD Foundation, Inc.
* All rights reserved.
*
- * This code was contributed to The NetBSD Foundation by Christos Zoulas.
+ * This code was contributed to The NetBSD Foundation by Christos Zoulas and
+ * Roland Illig.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -29,29 +30,106 @@
*/
#include <sys/cdefs.h>
-__COPYRIGHT("@(#) Copyright (c) 2008, 2010\
+__COPYRIGHT("@(#) Copyright (c) 2008, 2010, 2024\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_snprintb.c,v 1.8 2019/12/08 17:37:16 christos Exp $");
+__RCSID("$NetBSD: t_snprintb.c,v 1.39 2025/10/09 18:51:41 rillig Exp $");
+#include <stdio.h>
#include <string.h>
#include <util.h>
+#include <vis.h>
#include <atf-c.h>
+static const char *
+vis_arr(char *buf, size_t bufsize, const char *arr, size_t arrsize)
+{
+ ATF_REQUIRE(bufsize >= 2);
+ int rv = strnvisx(buf + 1, bufsize - 2, arr, arrsize,
+ VIS_WHITE | VIS_OCTAL);
+ ATF_REQUIRE_MSG(rv >= 0, "buffer too small for size %zu", arrsize);
+ buf[0] = '"';
+ buf[1 + rv] = '"';
+ buf[1 + rv + 1] = '\0';
+ return buf;
+}
+
static void
-h_snprintb(const char *fmt, uint64_t val, const char *expected)
+check_snprintb_m(const char *file, size_t line,
+ size_t bufsize, const char *bitfmt, size_t bitfmtlen, uint64_t val,
+ size_t line_max,
+ int want_rv, const char *want_buf, size_t want_bufsize)
{
- char actual[1024];
- int len, rlen;
+ char buf[1024], vis_bitfmt[1024], vis_want_buf[1024], vis_buf[1024];
+
+ ATF_REQUIRE(bufsize <= sizeof(buf));
+ ATF_REQUIRE(want_bufsize <= sizeof(buf));
+ if (bitfmtlen > 2 && bitfmt[0] == '\177')
+ ATF_REQUIRE_MSG(
+ bitfmt[bitfmtlen - 1] == '\0',
+ "%s:%zu: missing trailing '\\0' in new-style bitfmt",
+ file, line);
+ if (bufsize == 0)
+ want_bufsize = 0;
+ memset(buf, 0x5a, sizeof(buf));
+
+ int rv = snprintb_m(buf, bufsize, bitfmt, val, line_max);
- len = snprintb(actual, sizeof(actual), fmt, val);
- rlen = (int)strlen(actual);
+ size_t have_bufsize = sizeof(buf);
+ while (have_bufsize > 0 && buf[have_bufsize - 1] == 0x5a)
+ have_bufsize--;
+ if (rv > 0 && (unsigned)rv < have_bufsize
+ && buf[rv - 1] == '\0' && buf[rv] == '\0')
+ have_bufsize = rv + 1;
+ if (rv < 0)
+ for (size_t i = have_bufsize; i >= 2; i--)
+ if (buf[i - 2] == '\0' && buf[i - 1] == '\0')
+ have_bufsize = i;
- ATF_REQUIRE_STREQ_MSG(expected, actual, "format=%s val=%" PRIu64,
- fmt, val);
- ATF_REQUIRE_EQ_MSG(rlen, len, "expected=%d actual=%d", rlen, len);
+ ATF_CHECK_MSG(
+ rv == want_rv
+ && memcmp(buf, want_buf, want_bufsize) == 0
+ && (line_max == 0 || have_bufsize < 2
+ || buf[have_bufsize - 2] == '\0')
+ && (have_bufsize < 1 || buf[have_bufsize - 1] == '\0'),
+ "failed:\n"
+ "\ttest case: %s:%zu\n"
+ "\tformat: %s\n"
+ "\tvalue: %#jx\n"
+ "\tline_max: %zu\n"
+ "\twant: %d bytes %s\n"
+ "\thave: %d bytes %s\n",
+ file, line,
+ vis_arr(vis_bitfmt, sizeof(vis_bitfmt), bitfmt, bitfmtlen),
+ (uintmax_t)val,
+ line_max,
+ want_rv, vis_arr(vis_want_buf, sizeof(vis_want_buf),
+ want_buf, want_bufsize),
+ rv, vis_arr(vis_buf, sizeof(vis_buf), buf, have_bufsize));
}
+#define h_snprintb_m_len(bufsize, bitfmt, val, line_max, \
+ want_rv, want_buf) \
+ check_snprintb_m(__FILE__, __LINE__, \
+ bufsize, bitfmt, sizeof(bitfmt) - 1, val, line_max, \
+ want_rv, want_buf, sizeof(want_buf))
+
+#define h_snprintb(bitfmt, val, want_buf) \
+ h_snprintb_m_len(1024, bitfmt, val, 0, sizeof(want_buf) - 1, want_buf)
+
+#define h_snprintb_len(bufsize, bitfmt, val, want_rv, want_buf) \
+ h_snprintb_m_len(bufsize, bitfmt, val, 0, want_rv, want_buf)
+
+#define h_snprintb_error(bitfmt, want_buf) \
+ h_snprintb_m_len(1024, bitfmt, 0x00, 0, -1, want_buf)
+
+#define h_snprintb_val_error(bitfmt, val, want_buf) \
+ h_snprintb_m_len(1024, bitfmt, val, 0, -1, want_buf)
+
+#define h_snprintb_m(bitfmt, val, line_max, want_buf) \
+ h_snprintb_m_len(1024, bitfmt, val, line_max, \
+ sizeof(want_buf) - 1, want_buf)
+
ATF_TC(snprintb);
ATF_TC_HEAD(snprintb, tc)
{
@@ -59,70 +137,1012 @@ ATF_TC_HEAD(snprintb, tc)
}
ATF_TC_BODY(snprintb, tc)
{
- h_snprintb("\10\2BITTWO\1BITONE", 3, "03<BITTWO,BITONE>");
- h_snprintb("\177\20b\0A\0\0", 0, "0");
- h_snprintb("\177\20b\05NOTBOOT\0b\06FPP\0b\013SDVMA\0b\015VIDEO\0"
- "b\020LORES\0b\021FPA\0b\022DIAG\0b\016CACHE\0"
- "b\017IOCACHE\0b\022LOOPBACK\0b\04DBGCACHE\0",
- 0xe860, "0xe860<NOTBOOT,FPP,SDVMA,VIDEO,CACHE,IOCACHE>");
+ // style and number base, old style, octal, zero value
+ //
+ // The value 0 does not get a leading '0'.
+ h_snprintb(
+ "\010",
+ 0x00,
+ "0");
+
+ // style and number base, old style, octal, nonzero value
+ //
+ // Nonzero octal values get a leading '0'.
+ h_snprintb(
+ "\010",
+ 0xff,
+ "0377");
+
+ // style and number base, old style, decimal, zero value
+ h_snprintb(
+ "\012",
+ 0x00,
+ "0");
+
+ // style and number base, old style, decimal, nonzero value
+ h_snprintb(
+ "\012",
+ 0xff,
+ "255");
+
+ // style and number base, old style, hexadecimal, zero value
+ //
+ // The value 0 does not get a leading '0x'.
+ h_snprintb(
+ "\020",
+ 0x00,
+ "0");
+
+ // style and number base, old style, hexadecimal, nonzero value
+ //
+ // Nonzero hexadecimal values get a leading '0x'.
+ h_snprintb(
+ "\177\020",
+ 0xff,
+ "0xff");
+
+ // style and number base, old style, invalid base 0
+ h_snprintb_error(
+ "",
+ "#");
+
+ // style and number base, old style, invalid base 2
+ h_snprintb_error(
+ "\002",
+ "#");
+
+ // style and number base, old style, invalid base 255 or -1
+ h_snprintb_error(
+ "\377",
+ "#");
+
+ // style and number base, new style, octal, zero value
+ //
+ // The value 0 does not get a leading '0'.
+ h_snprintb(
+ "\177\010",
+ 0x00,
+ "0");
+
+ // style and number base, new style, octal, nonzero value
+ //
+ // Nonzero octal values get a leading '0'.
+ h_snprintb(
+ "\177\010",
+ 0xff,
+ "0377");
+
+ // style and number base, new style, decimal, zero value
+ h_snprintb(
+ "\177\012",
+ 0x00,
+ "0");
+
+ // style and number base, new style, decimal, nonzero value
+ h_snprintb(
+ "\177\012",
+ 0xff,
+ "255");
+
+ // style and number base, new style, hexadecimal, zero value
+ //
+ // The value 0 does not get a leading '0x'.
+ h_snprintb(
+ "\177\020",
+ 0x00,
+ "0");
+
+ // style and number base, new style, hexadecimal, nonzero value
+ //
+ // Nonzero hexadecimal values get a leading '0x'.
+ h_snprintb(
+ "\177\020",
+ 0xff,
+ "0xff");
+
+ // style and number base, new style, invalid number base 0
+ h_snprintb_error(
+ "\177",
+ "#");
+
+ // style and number base, new style, invalid number base 2
+ h_snprintb_error(
+ "\177\002",
+ "#");
+
+ // style and number base, new style, invalid number base 255 or -1
+ h_snprintb_error(
+ "\177\377",
+ "#");
+
+ // old style, from lsb to msb
+ h_snprintb(
+ "\020"
+ "\001bit1"
+ "\002bit2"
+ "\037bit31"
+ "\040bit32",
+ 0xffffffff80000001,
+ "0xffffffff80000001<bit1,bit32>");
+
+ // old style, invalid bit number, at the beginning
+ h_snprintb_error(
+ "\020"
+ "\041invalid",
+ "0#");
+
+ // old style, invalid bit number, in the middle
+ //
+ // The old-style format supports only 32 bits, interpreting the
+ // \041 as part of the text belonging to bit 1.
+ h_snprintb(
+ "\020"
+ "\001bit1"
+ "\041bit33",
+ 0x01,
+ "0x1<bit1!bit33>");
+
+ // old style, repeated bit numbers
+ //
+ // When a bit number is mentioned more than once,
+ // this is most likely a typo.
+ h_snprintb(
+ "\020"
+ "\001once"
+ "\001again",
+ 0x01,
+ "0x1<once,again>");
+
+ // old style, non-printable description
+ //
+ // The characters ' ' and '\t' are interpreted as bit numbers,
+ // not as part of the description; the visual arrangement in this
+ // example is intentionally misleading.
+ h_snprintb(
+ "\020"
+ "\001least significant"
+ "\002horizontal\ttab"
+ "\003\xC3\xA4",
+ 0xff,
+ "0xff<least,horizontal,\xC3\xA4>");
+
+ // old style, empty description
+ //
+ // The description of a bit in the old format must not be empty,
+ // to prevent multiple commas in a row.
+ h_snprintb_val_error(
+ "\020"
+ "\001lsb"
+ "\004"
+ "\005"
+ "\010msb",
+ 0xff,
+ "0xff<lsb#");
+
+ // old style, buffer size 0, null buffer
+ //
+ // If the buffer size is 0, the buffer is not accessed at all and
+ // may be a null pointer.
+ int null_rv_old = snprintb(NULL, 0, "\020\001lsb", 0x01);
+ ATF_CHECK_MSG(
+ null_rv_old == 8,
+ "want length 8, have %d", null_rv_old);
+
+ // old style, buffer too small for value
+ h_snprintb_len(
+ 1, "\020", 0x00,
+ 1, "");
+
+ // old style, buffer large enough for zero value
+ h_snprintb_len(
+ 2, "\020", 0x00,
+ 1, "0");
+
+ // old style, buffer too small for nonzero value
+ h_snprintb_len(
+ 3, "\020", 0x07,
+ 3, "0#");
- h_snprintb("\177\20f\0\4FOO\0=\1ONE\0=\2TWO\0\0", 1,
- "0x1<FOO=0x1=ONE>");
- h_snprintb("\177\20f\0\4X\0=\1ONE\0=\2TWO\0\0", 1,
- "0x1<X=0x1=ONE>");
- h_snprintb("\177\020F\0\4\0:\1ONE\0:\2TWO\0\0", 1,
- "0x1<ONE>");
+ // old style, buffer large enough for nonzero value
+ h_snprintb_len(
+ 4, "\020", 0x07,
+ 3, "0x7");
- h_snprintb("\177\20f\0\4FOO\0=\1ONE\0=\2TWO\0\0", 2,
- "0x2<FOO=0x2=TWO>");
- h_snprintb("\177\20f\0\4X\0=\1ONE\0=\2TWO\0\0", 2,
- "0x2<X=0x2=TWO>");
- h_snprintb("\177\020F\0\4\0:\1ONE\0:\2TWO\0\0", 2,
- "0x2<TWO>");
+ // old style, buffer too small for '<'
+ h_snprintb_len(
+ 4, "\020\001lsb", 0x07,
+ 8, "0x#");
- h_snprintb("\177\20f\0\4FOO\0=\1ONE\0=\2TWO\0*=OTHER\0\0", 3,
- "0x3<FOO=0x3=OTHER>");
- h_snprintb("\177\20f\0\4X\0=\1ONE\0=\2TWO\0*=Other(%jd)\0\0", 3,
- "0x3<X=0x3=Other(3)>");
- h_snprintb("\177\20f\0\x8X\0=\1ONE\0=\2TWO\0*=other(%jo)\0\0", 0x20,
- "0x20<X=0x20=other(40)>");
- h_snprintb("\177\020F\0\4\0:\1ONE\0:\2TWO\0\0", 3,
+ // old style, buffer too small for description
+ h_snprintb_len(
+ 7, "\020\001lsb", 0x07,
+ 8, "0x7<l#");
+
+ // old style, buffer too small for '>'
+ h_snprintb_len(
+ 8, "\020\001lsb", 0x07,
+ 8, "0x7<ls#");
+
+ // old style, buffer large enough for '>'
+ h_snprintb_len(
+ 9, "\020\001lsb", 0x07,
+ 8, "0x7<lsb>");
+
+ // old style, buffer too small for second description
+ h_snprintb_len(
+ 9, "\020\001one\002two", 0x07,
+ 12, "0x7<one#");
+
+ // old style, buffer too small for second description
+ h_snprintb_len(
+ 10, "\020\001one\002two", 0x07,
+ 12, "0x7<one,#");
+
+ // old style, buffer too small for '>' after second description
+ h_snprintb_len(
+ 12, "\020\001one\002two", 0x07,
+ 12, "0x7<one,tw#");
+
+ // old style, buffer large enough for '>' after second description
+ h_snprintb_len(
+ 13, "\020\001one\002two", 0x07,
+ 12, "0x7<one,two>");
+
+ // new style, buffer size 0, null buffer
+ //
+ // If the buffer size is 0, the buffer may be NULL.
+ int null_rv_new = snprintb(NULL, 0, "\177\020b\000lsb\0", 0x01);
+ ATF_CHECK_MSG(
+ null_rv_new == 8,
+ "want length 8, have %d", null_rv_new);
+
+ // new style single bits
+ h_snprintb(
+ "\177\020"
+ "b\000lsb\0"
+ "b\001above-lsb\0"
+ "b\037bit31\0"
+ "b\040bit32\0"
+ "b\076below-msb\0"
+ "b\077msb\0",
+ 0x8000000180000001,
+ "0x8000000180000001<lsb,bit31,bit32,msb>");
+
+ // new style single bits, duplicate bits
+ h_snprintb(
+ "\177\020"
+ "b\000lsb\0"
+ "b\000lsb\0"
+ "b\000lsb\0",
+ 0xff,
+ "0xff<lsb,lsb,lsb>");
+
+ // new style single bits, 'b' with empty description
+ //
+ // The description of a 'b' conversion must not be empty, as the
+ // output would contain several commas in a row.
+ h_snprintb_val_error(
+ "\177\020"
+ "b\000lsb\0"
+ "b\001\0"
+ "b\002\0"
+ "b\007msb\0",
+ 0xff,
+ "0xff<lsb#");
+
+ // new style single bits, bit number too large
+ h_snprintb_error(
+ "\177\020"
+ "b\100too-high\0",
+ "0#");
+ h_snprintb_error(
+ "\177\020"
+ "b\377too-high\0",
+ "0#");
+
+ // new style single bits, non-printable description
+ //
+ // Contrary to the old-style format, the new-style format allows
+ // arbitrary characters in the description, even control characters
+ // and non-ASCII characters.
+ h_snprintb(
+ "\177\020"
+ "b\000space \t \xC3\xA4\0",
+ 0x1,
+ "0x1<space \t \xC3\xA4>");
+
+ // new style named bit-field, octal
+ //
+ // The bit-field value gets a leading '0' iff it is nonzero.
+ h_snprintb(
+ "\177\010"
+ "f\000\010byte0\0"
+ "f\010\010byte1\0",
+ 0x0100,
+ "0400<byte0=0,byte1=01>");
+
+ // new style named bit-field, decimal
+ h_snprintb(
+ "\177\012"
+ "f\000\010byte0\0"
+ "f\010\010byte1\0",
+ 0x0100,
+ "256<byte0=0,byte1=1>");
+
+ // new style named bit-field, hexadecimal
+ //
+ // The bit-field value gets a leading '0x' iff it is nonzero.
+ h_snprintb(
+ "\177\020"
+ "f\000\010byte0\0"
+ "f\010\010byte1\0",
+ 0x0100,
+ "0x100<byte0=0,byte1=0x1>");
+
+ // new style bit-field, from 0 width 0
+ h_snprintb(
+ "\177\020"
+ "f\000\000zero-width\0"
+ "=\000zero\0",
+ 0xffff,
+ "0xffff<zero-width=0=zero>");
+
+ // new style bit-field, from 0 width 1
+ h_snprintb(
+ "\177\020"
+ "f\000\001lsb\0"
+ "=\000zero\0"
+ "=\001one\0",
+ 0x0,
+ "0<lsb=0=zero>");
+ h_snprintb(
+ "\177\020"
+ "f\000\001lsb\0"
+ "=\000zero\0"
+ "=\001one\0",
+ 0x1,
+ "0x1<lsb=0x1=one>");
+
+ // new style bit-field, from 0 width 63
+ h_snprintb(
+ "\177\020"
+ "f\000\077uint63\0"
+ "=\125match\0",
+ 0xaaaa5555aaaa5555,
+ "0xaaaa5555aaaa5555<uint63=0x2aaa5555aaaa5555>");
+
+ // new style bit-field, from 0 width 64
+ h_snprintb(
+ "\177\020"
+ "f\000\100uint64\0"
+ "=\125match\0",
+ 0xaaaa5555aaaa5555,
+ "0xaaaa5555aaaa5555<uint64=0xaaaa5555aaaa5555>");
+
+ // new style bit-field, from 0 width 65
+ h_snprintb_error(
+ "\177\020"
+ "f\000\101uint65\0",
+ "0#");
+
+ // new style bit-field, from 1 width 8
+ h_snprintb(
+ "\177\020"
+ "f\001\010uint8\0"
+ "=\203match\0",
+ 0x0106,
+ "0x106<uint8=0x83=match>");
+
+ // new style bit-field, from 1 width 9
+ //
+ // The '=' and ':' directives can match a bit-field value between
+ // 0 and 255, independent of the bit-field's width.
+ h_snprintb(
+ "\177\020"
+ "f\001\011uint9\0"
+ "=\203match\0"
+ "*=default-f\0"
+ "F\001\011\0"
+ ":\203match\0"
+ "*default-F\0",
+ 0x0306,
+ "0x306<uint9=0x183=default-f,default-F>");
+
+ // new style bit-field, from 24 width 32
+ h_snprintb(
+ "\177\020"
+ "f\030\040uint32\0",
+ 0xaaaa555500000000,
+ "0xaaaa555500000000<uint32=0xaa555500>");
+
+ // new style bit-field, from 60 width 4
+ h_snprintb(
+ "\177\020"
+ "f\074\004uint4\0",
+ 0xf555555555555555,
+ "0xf555555555555555<uint4=0xf>");
+
+ // new style bit-field, from 60 width 5
+ //
+ // The end of the bit-field is out of bounds.
+ h_snprintb(
+ "\177\020"
+ "f\074\005uint5\0",
+ 0xf555555555555555,
+ "0xf555555555555555<uint5=0xf>");
+
+ // new style bit-field, from 64 width 0
+ //
+ // The beginning of the bit-field is out of bounds, the end is fine.
+ h_snprintb_error(
+ "\177\020"
+ "f\100\000uint0\0",
+ "0#");
+
+ // new style bit-field, from 65 width 0
+ //
+ // The beginning and end of the bit-field are out of bounds.
+ h_snprintb_error(
+ "\177\020"
+ "f\101\000uint0\0",
+ "0#");
+
+ // new style bit-field, 'f' with empty description
+ //
+ // The description of an 'f' conversion must not be empty, as the
+ // output would contain an isolated '='.
+ h_snprintb_val_error(
+ "\177\020"
+ "f\000\004\0"
+ "=\001one\0",
+ 0x1,
+ "0x1#");
+
+ // new style bit-field, non-printable description
+ //
+ // Contrary to the old-style format, the new-style format allows
+ // arbitrary characters in the description, even control characters
+ // and non-ASCII characters.
+ h_snprintb(
+ "\177\020"
+ "f\000\010\t \xC3\xA4\0"
+ "=\001\t \xC3\xA4\0"
+ "F\000\010\0"
+ ":\001\t \xC3\xA4\0"
+ "F\000\010\0"
+ "*\t \xC3\xA4\0",
+ 0x1,
+ "0x1<\t \xC3\xA4=0x1=\t \xC3\xA4,\t \xC3\xA4,\t \xC3\xA4>");
+
+ // new style bit-field, '=' with empty description
+ //
+ // The description of a '=' conversion must not be empty, as the
+ // output would contain several '=' in a row.
+ h_snprintb_val_error(
+ "\177\020"
+ "f\000\004f\0"
+ "=\001one\0"
+ "=\001\0"
+ "=\001\0",
+ 0x1,
+ "0x1<f=0x1=one#");
+
+ // new style bit-field, 'F' followed by ':' with empty description
+ //
+ // The description of a ':' conversion must not be empty, as the
+ // output would contain empty angle brackets.
+ h_snprintb_val_error(
+ "\177\020"
+ "F\000\004\0"
+ ":\001\0"
+ "*default\0",
+ 0x1,
+ "0x1<#");
+
+ // new style bit-field, 'F', ':' with empty description, '*'
+ //
+ // The description of a ':' conversion must not be empty, as the
+ // output would contain empty angle brackets. Not in this particular
+ // test case, as the value is different, but the structural error is
+ // detected nevertheless.
+ h_snprintb_val_error(
+ "\177\020"
+ "F\000\004\0"
+ ":\001\0"
+ "*default\0",
+ 0x2,
+ "0x2<#");
+
+ // new style bit-field, 'f' with non-exhaustive '='
+ h_snprintb(
+ "\177\020"
+ "f\000\004Field\0"
+ "=\1one\0"
+ "=\2two\0",
+ 0x3,
+ "0x3<Field=0x3>");
+
+ // new style bit-field, 'F' with non-exhaustive ':'
+ //
+ // An unnamed bit-field that does not match any values generates empty
+ // angle brackets, which looks confusing. The ':' directives should
+ // either be exhaustive, or there should be a '*' catch-all directive.
+ h_snprintb(
+ "\177\020"
+ "F\000\004\0"
+ ":\1one\0"
+ ":\2two\0",
+ 0x3,
"0x3<>");
- h_snprintb("\177\20f\0\4Field_1\0=\1ONE\0=\2TWO\0"
- "f\4\4Field_2\0=\1ONE\0=\2TWO\0\0", 0x12,
- "0x12<Field_1=0x2=TWO,Field_2=0x1=ONE>");
+ // new style bit-field, 'F' with non-exhaustive ':'
+ //
+ // A bit-field that does not match any values generates multiple
+ // commas in a row, which looks confusing. The ':' conversions should
+ // either be exhaustive, or there should be a '*' catch-all
+ // conversion.
+ h_snprintb(
+ "\177\020"
+ "b\000bit0\0"
+ "F\000\004\0"
+ ":\1one\0"
+ ":\2two\0"
+ "b\001bit1\0",
+ 0x3,
+ "0x3<bit0,,bit1>");
- h_snprintb("\177\20f\0\4Field_1\0=\1ONE\0=\2TWO\0"
- "F\x8\4\0*Field_3=%jd\0"
- "f\4\4Field_2\0:\1:ONE\0:\2:TWO\0\0", 0xD12,
- "0xd12<Field_1=0x2=TWO,Field_3=13,Field_2=0x1:ONE>");
-}
+ // new style bit-field, '=', can never match
+ //
+ // The extracted value from the bit-field has 7 bits and is thus less
+ // than 128, therefore it can neither match 128 nor 255.
+ h_snprintb(
+ "\177\020"
+ "f\000\007f\0"
+ "=\200never\0"
+ "=\377never\0",
+ 0xff,
+ "0xff<f=0x7f>");
-static void
-h_snprintb_m(const char *fmt, uint64_t val, int line_max, const char *res,
- int rlen)
-{
- char buf[1024];
- int len;
+ // new style, two separate bit-fields
+ h_snprintb(
+ "\177\020"
+ "f\000\004f1\0"
+ "=\001one\0"
+ "=\002two\0"
+ "f\004\004f2\0"
+ "=\001one\0"
+ "=\002two\0",
+ 0x12,
+ "0x12<f1=0x2=two,f2=0x1=one>");
- len = snprintb_m(buf, sizeof(buf), fmt, val, line_max);
+ // new style, mixed named and unnamed bit-fields
+ h_snprintb(
+ "\177\020"
+ "f\000\004f1\0"
+ "=\001one\0"
+ "=\002two\0"
+ "F\010\004\0"
+ ":\015thirteen\0"
+ "f\004\004f2\0"
+ "=\001one\0"
+ "=\002two\0",
+ 0x0d12,
+ "0xd12<f1=0x2=two,thirteen,f2=0x1=one>");
- const char *expected = res;
- char *actual = buf;
- int l = 0;
- for (size_t i = 0; l < rlen; i++) {
- l = (int)strlen(actual);
- if (l == 0)
- break;
- ATF_REQUIRE_STREQ_MSG(expected, actual,
- "%zu: fmt=%s val=%" PRIu64, i, fmt, val);
- actual += l;
- expected += l;
+ // new style bit-field, overlapping
+ h_snprintb(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\002\004mid\0"
+ "f\004\004hi\0"
+ "f\000\010all\0",
+ 0x18,
+ "0x18<lo=0x8,mid=0x6,hi=0x1,all=0x18>");
+
+ // new style bit-field, difference between '=' and ':'
+ //
+ // The ':' conversion can almost emulate the '=' conversion by
+ // starting its description with '=', excluding the numeric value of
+ // the field. The 'f' and '=' conversions mix well, and so do 'F' and
+ // ':'. Other combinations don't mix well and are thus erroneous.
+ h_snprintb(
+ "\177\020"
+ "f\000\004field\0"
+ "=\010f-value\0"
+ "F\000\000\0" // Use an empty bit-field
+ ":\000separator\0" // to generate a separator.
+ "F\000\004\0"
+ ":\010F-value\0",
+ 0x18,
+ "0x18<field=0x8=f-value,separator,F-value>");
+
+ // new style bit-field default, fixed string
+ //
+ // When used with the 'f' conversion, the '*' conversion should
+ // start with '=' to match the rest of the format.
+ //
+ // When used with the 'F' conversion, the '*' conversion should not
+ // start with '=' to avoid the wrong punctuation ',=' in the output.
+ h_snprintb(
+ "\177\020"
+ "f\030\010f1\0"
+ "*default-f\0"
+ "f\020\010f2\0"
+ "*=default-f\0"
+ "F\010\010\0"
+ "*default-F\0"
+ "F\010\010\0"
+ "*=default-F\0",
+ 0x11223344,
+ "0x11223344<f1=0x11default-f,f2=0x22=default-f,default-F,=default-F>");
+
+ // new style bit-field default, numeric conversion specifier
+ h_snprintb(
+ "\177\020"
+ "f\010\010f\0"
+ "*=f(%ju)\0"
+ "F\000\010F\0"
+ "*F(%ju)\0",
+ 0x1122,
+ "0x1122<f=0x11=f(17),F(34)>");
+
+ // new style bit-field default, can never match
+ //
+ // The '=' conversions are exhaustive, making the '*' redundant.
+ h_snprintb(
+ "\177\020"
+ "f\010\002f\0"
+ "=\000zero\0"
+ "=\001one\0"
+ "=\002two\0"
+ "=\003three\0"
+ "*default\0",
+ 0xff00,
+ "0xff00<f=0x3=three>");
+
+ // new style bit-field default, invalid conversion specifier
+ //
+ // There is no reliable way to make snprintf return an error, as such
+ // errors are defined as undefined behavior in the C standard.
+ // Instead, here's a conversion specifier that produces a literal '%'.
+ h_snprintb(
+ "\177\020"
+ "f\000\010f\0"
+ "*=%030ju%%\0",
+ 0xff,
+ "0xff<f=0xff=000000000000000000000000000255%>");
+
+ // new style unknown conversion, at the beginning
+ h_snprintb_val_error(
+ "\177\020"
+ "unknown\0",
+ 0xff,
+ "0xff#");
+
+ // new style unknown conversion, after a known conversion
+ h_snprintb_val_error(
+ "\177\020"
+ "b\007msb\0"
+ "unknown\0",
+ 0xff,
+ "0xff<msb#");
+
+ // new style combinations, 'b' '='
+ //
+ // A '=' conversion requires a preceding 'f' conversion.
+ h_snprintb_val_error(
+ "\177\020"
+ "b\004bit4\0"
+ "=\000clear\0"
+ "=\001set\0"
+ "=\245complete\0"
+ "b\000bit0\0"
+ "=\000clear\0"
+ "=\001set\0"
+ "=\245complete\0",
+ 0xa5,
+ "0xa5#");
+
+ // new style combinations, 'b' ':'
+ //
+ // A ':' conversion requires a preceding 'f' or 'F' conversion.
+ h_snprintb_val_error(
+ "\177\020"
+ "b\004bit4\0"
+ ":\000clear\0"
+ ":\001set\0"
+ ":\245complete\0"
+ "b\000bit0\0"
+ ":\000clear\0"
+ ":\001set\0"
+ ":\245complete\0",
+ 0xa5,
+ "0xa5#");
+
+ // new style combinations, 'b' '*'
+ //
+ // A '*' conversion requires a preceding 'f' or 'F' conversion.
+ h_snprintb_val_error(
+ "\177\020"
+ "b\004bit4\0"
+ "*default(%ju)\0"
+ "b\000bit0\0"
+ "*default(%ju)\0",
+ 0xa5,
+ "0xa5#");
+
+ // new style combinations, 'f' 'b' '='
+ //
+ // A '=' conversion requires a preceding 'f' conversion, there must
+ // not be a 'b' conversion in between.
+ h_snprintb_val_error(
+ "\177\020"
+ "f\000\010f\0"
+ "b\005bit5\0"
+ "=\245match\0",
+ 0xa5,
+ "0xa5<f=0xa5,bit5#");
+
+ // new style combinations, 'F' 'b' ':'
+ //
+ // A ':' conversion requires a preceding 'F' conversion, there must
+ // not be a 'b' conversion in between.
+ //
+ // The isolated leading comma is produced by the non-exhaustive 'F'
+ // conversion. Detecting these at runtime would be too costly.
+ h_snprintb_val_error(
+ "\177\020"
+ "F\000\010f\0"
+ "b\005bit5\0"
+ ":\245match\0",
+ 0xa5,
+ "0xa5<,bit5#");
+
+ // new style combinations, 'f' ':'
+ //
+ // The ':' conversion requires a preceding 'F' conversion, not 'f'.
+ // Otherwise, the output would be "0x1<nibble=0x1one>", missing a
+ // separator between the number and the description "one".
+ h_snprintb_val_error(
+ "\177\20"
+ "f\000\004nibble\0"
+ ":\001one\0",
+ 0x01,
+ "0x1<nibble=0x1#");
+
+ // new style combinations, 'f' ':' with punctuation
+ //
+ // When the description starts with punctuation, in this case round
+ // parentheses, the resulting string is easily readable.
+ h_snprintb(
+ "\177\20"
+ "f\000\002field\0" ":\0(zero)\0"
+ "f\000\002field\0" "*(catch-all)\0",
+ 0x0000,
+ "0<field=0(zero),field=0(catch-all)>");
+
+ // new style combinations, 'F' '='
+ //
+ // A '=' conversion requires a preceding 'f' conversion, not 'F'.
+ h_snprintb_val_error(
+ "\177\20"
+ "F\000\004\0"
+ "=\001one\0",
+ 0x01,
+ "0x1<#");
+
+ // new style combinations, '='
+ //
+ // A '=' conversion requires a preceding 'f' or 'F' conversion.
+ h_snprintb_val_error(
+ "\177\020"
+ "=\245match\0",
+ 0xa5,
+ "0xa5#");
+
+ // new style combinations, ':'
+ //
+ // A ':' conversion requires a preceding 'f' or 'F' conversion.
+ h_snprintb_val_error(
+ "\177\020"
+ ":\245match\0",
+ 0xa5,
+ "0xa5#");
+
+ // new style combinations, '*'
+ //
+ // A '*' conversion requires a preceding 'f' or 'F' conversion.
+ h_snprintb_val_error(
+ "\177\020"
+ "*match\0",
+ 0xa5,
+ "0xa5#");
+
+ // new style combinations, 'f' '*' '='
+ //
+ // After a catch-all '*' conversion, there must not be further '='
+ // conversions.
+ h_snprintb_val_error(
+ "\177\020"
+ "f\000\010f\0"
+ "*=default\0"
+ "=\245match\0",
+ 0xa5,
+ "0xa5<f=0xa5=default#");
+
+ // new style combinations, 'F' '*' ':'
+ //
+ // After a catch-all '*' conversion, there must not be further ':'
+ // conversions.
+ h_snprintb_val_error(
+ "\177\020"
+ "F\000\010F\0"
+ "*default\0"
+ ":\245-match\0",
+ 0xa5,
+ "0xa5<default#");
+
+ // new style combinations, 'f' '*' '*'
+ //
+ // After a catch-all '*' conversion, there must not be further '=' or
+ // '*' conversions.
+ h_snprintb_val_error(
+ "\177\020"
+ "f\000\010f\0"
+ "*=default-f\0"
+ "*ignored\0",
+ 0xa5,
+ "0xa5<f=0xa5=default-f#");
+
+ // new style combinations, 'F' '*' '*'
+ //
+ // After a catch-all '*' conversion, there must not be further ':' or
+ // '*' conversions.
+ h_snprintb_val_error(
+ "\177\020"
+ "F\000\010\0"
+ "*default-F\0"
+ "*ignored\0",
+ 0xa5,
+ "0xa5<default-F#");
+
+ // example from the manual page, old style octal
+ h_snprintb(
+ "\010\002BITTWO\001BITONE",
+ 0x03,
+ "03<BITTWO,BITONE>");
+
+ // example from the manual page, old style hexadecimal
+ //
+ // When using a hexadecimal escape sequence to encode a bit number,
+ // the description must not start with a hexadecimal digit, or that
+ // digit is interpreted as part of the bit number. To prevent this,
+ // the bit number and the description need to be written as separate
+ // string literals.
+ h_snprintb(
+ "\x10"
+ "\x10" "NOTBOOT"
+ "\x0f" "FPP"
+ "\x0e" "SDVMA"
+ "\x0c" "VIDEO"
+ "\x0b" "LORES"
+ "\x0a" "FPA"
+ "\x09" "DIAG"
+ "\x07" "CACHE"
+ "\x06" "IOCACHE"
+ "\x05" "LOOPBACK"
+ "\x04" "DBGCACHE",
+ 0xe860,
+ "0xe860<NOTBOOT,FPP,SDVMA,VIDEO,CACHE,IOCACHE>");
+
+ // example from the manual page, new style bits and fields
+ h_snprintb(
+ "\177\020"
+ "b\000" "LSB\0"
+ "b\001" "BITONE\0"
+ "f\004\004" "NIBBLE2\0"
+ "f\020\004" "BURST\0"
+ "=\x04" "FOUR\0"
+ "=\x0f" "FIFTEEN\0"
+ "b\037" "MSB\0",
+ 0x800f0701,
+ "0x800f0701<LSB,NIBBLE2=0,BURST=0xf=FIFTEEN,MSB>");
+
+ // example from the manual page, new style mmap
+#define MAP_FMT \
+ "\177\020" \
+ "b\0" "SHARED\0" \
+ "b\1" "PRIVATE\0" \
+ "b\2" "COPY\0" \
+ "b\4" "FIXED\0" \
+ "b\5" "RENAME\0" \
+ "b\6" "NORESERVE\0" \
+ "b\7" "INHERIT\0" \
+ "b\11" "HASSEMAPHORE\0" \
+ "b\12" "TRYFIXED\0" \
+ "b\13" "WIRED\0" \
+ "F\14\1\0" \
+ ":\0" "FILE\0" \
+ ":\1" "ANONYMOUS\0" \
+ "b\15" "STACK\0" \
+ "F\30\010\0" \
+ ":\000" "ALIGN=NONE\0" \
+ ":\015" "ALIGN=8KB\0" \
+ "*" "ALIGN=2^%ju\0"
+ h_snprintb(
+ MAP_FMT,
+ 0x0d001234,
+ "0xd001234<COPY,FIXED,RENAME,HASSEMAPHORE,ANONYMOUS,ALIGN=8KB>");
+ h_snprintb(
+ MAP_FMT,
+ 0x2e000000,
+ "0x2e000000<FILE,ALIGN=2^46>");
+
+ // It is possible but cumbersome to implement a reduced variant of
+ // rot13 using snprintb, shown here for lowercase letters only.
+ for (char ch = 'A'; ch <= '~'; ch++) {
+ char rot13 = ch >= 'a' && ch <= 'm' ? ch + 13
+ : ch >= 'n' && ch <= 'z' ? ch - 13
+ : '?';
+ char expected[8];
+ ATF_REQUIRE_EQ(7,
+ snprintf(expected, sizeof(expected), "%#x<%c>", ch, rot13));
+ h_snprintb(
+ "\177\020"
+ "F\000\010\0"
+ ":an\0:bo\0:cp\0:dq\0:er\0:fs\0:gt\0:hu\0"
+ ":iv\0:jw\0:kx\0:ly\0:mz\0"
+ ":na\0:ob\0:pc\0:qd\0:re\0:sf\0:tg\0:uh\0"
+ ":vi\0:wj\0:xk\0:yl\0:zm\0"
+ // If snprintf accepted "%jc", it would be possible to
+ // echo the non-alphabetic characters instead of a
+ // catchall question mark.
+ "*?\0",
+ ch,
+ expected);
}
-
- ATF_REQUIRE_EQ_MSG(rlen, len, "expected=%d actual=%d", rlen, len);
+
+ // new style, small buffers
+ h_snprintb_len(
+ 0, "\177\020", 0x00,
+ 1, "");
+ h_snprintb_len(
+ 1, "\177\020", 0x00,
+ 1, "");
+ h_snprintb_len(
+ 2, "\177\020", 0x00,
+ 1, "0");
+ h_snprintb_len(
+ 3, "\177\020", 0x00,
+ 1, "0");
+ h_snprintb_len(
+ 3, "\177\020", 0x07,
+ 3, "0#");
+ h_snprintb_len(
+ 4, "\177\020", 0x07,
+ 3, "0x7");
+ h_snprintb_len(
+ 7, "\177\020b\000lsb\0", 0x07,
+ 8, "0x7<l#");
+ h_snprintb_len(
+ 8, "\177\020b\000lsb\0", 0x07,
+ 8, "0x7<ls#");
+ h_snprintb_len(
+ 9, "\177\020b\000lsb\0", 0x07,
+ 8, "0x7<lsb>");
+ h_snprintb_len(
+ 9, "\177\020b\000one\0b\001two\0", 0x07,
+ 12, "0x7<one#");
+ h_snprintb_len(
+ 10, "\177\020b\000one\0b\001two\0", 0x07,
+ 12, "0x7<one,#");
+ h_snprintb_len(
+ 12, "\177\020b\000one\0b\001two\0", 0x07,
+ 12, "0x7<one,tw#");
+ h_snprintb_len(
+ 13, "\177\020b\000one\0b\001two\0", 0x07,
+ 12, "0x7<one,two>");
}
ATF_TC(snprintb_m);
@@ -132,24 +1152,482 @@ ATF_TC_HEAD(snprintb_m, tc)
}
ATF_TC_BODY(snprintb_m, tc)
{
- h_snprintb_m("\177\020b\0LSB\0b\1_BITONE\0f\4\4NIBBLE2\0"
- "f\x10\4BURST\0=\4FOUR\0=\xfSIXTEEN\0"
- "b\x1fMSB\0\0",
- 0x800f0701,
- 33,
- "0x800f0701<LSB,NIBBLE2=0>\0"
- "0x800f0701<BURST=0xf=SIXTEEN,MSB>\0\0",
- 60);
- h_snprintb_m("\177\020b\0LSB\0b\1_BITONE\0f\4\4NIBBLE2\0"
- "f\x10\4BURST\0=\4FOUR\0=\xfSIXTEEN\0"
- "b\x1fMSB\0\0",
- 0x800f0701,
- 32,
- "0x800f0701<LSB,NIBBLE2=0>\0"
- "0x800f0701<BURST=0xf=SIXTEEN>\0"
- "0x800f0701<MSB>\0\0",
- 72);
+ // old style, line_max exceeded by number in line 1
+ h_snprintb_m(
+ "\020",
+ 0xff,
+ 1,
+ "#\0");
+
+ // old style, line_max exceeded by '<' in line 1
+ h_snprintb_m(
+ "\020"
+ "\001lsb",
+ 0xff,
+ 4,
+ "0xf#\0");
+
+ // old style, line_max exceeded by description
+ h_snprintb_m(
+ "\020"
+ "\001bit1"
+ "\002bit2",
+ 0xff,
+ 7,
+ "0xff<b#\0"
+ "0xff<b#\0");
+
+ // old style, line_max exceeded by '>' in line 1
+ h_snprintb_m(
+ "\020"
+ "\001bit1"
+ "\0022",
+ 0xff,
+ 9,
+ "0xff<bit#\0"
+ "0xff<2>\0");
+
+ // old style, line_max exceeded by description in line 2
+ h_snprintb_m(
+ "\020"
+ "\0011"
+ "\002bit2",
+ 0xff,
+ 8,
+ "0xff<1>\0"
+ "0xff<bi#\0");
+
+ // old style, line_max exceeded by '>' in line 2
+ h_snprintb_m(
+ "\020"
+ "\0011"
+ "\002bit2",
+ 0xff,
+ 9,
+ "0xff<1>\0"
+ "0xff<bit#\0");
+
+ // old style, complete
+ h_snprintb_m(
+ "\020"
+ "\0011"
+ "\002bit2",
+ 0xff,
+ 10,
+ "0xff<1>\0"
+ "0xff<bit2>\0");
+
+ // new style, line_max exceeded by value in line 1
+ h_snprintb_m(
+ "\177\020",
+ 0xff,
+ 3,
+ "0x#\0");
+
+ // new style, line_max exceeded by single-bit '<' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "b\000bit\0",
+ 0xff,
+ 4,
+ "0xf#\0");
+
+ // new style, line_max exceeded by single-bit description in line 1
+ h_snprintb_m(
+ "\177\020"
+ "b\000bit0\0"
+ "b\001two\0",
+ 0xff,
+ 8,
+ "0xff<bi#\0"
+ "0xff<tw#\0");
+
+ // new style, line_max exceeded by single-bit '>' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "b\000bit0\0"
+ "b\001two\0",
+ 0xff,
+ 9,
+ "0xff<bit#\0"
+ "0xff<two>\0");
+
+ // new style, line_max exceeded by single-bit description in line 2
+ h_snprintb_m(
+ "\177\020"
+ "b\000one\0"
+ "b\001three\0",
+ 0xff,
+ 9,
+ "0xff<one>\0"
+ "0xff<thr#\0");
+
+ // new style, line_max exceeded by single-bit '>' in line 2
+ h_snprintb_m(
+ "\177\020"
+ "b\000one\0"
+ "b\001three\0",
+ 0xff,
+ 10,
+ "0xff<one>\0"
+ "0xff<thre#\0");
+
+ // new style, single-bit complete
+ h_snprintb_m(
+ "\177\020"
+ "b\000one\0"
+ "b\001three\0",
+ 0xff,
+ 11,
+ "0xff<one>\0"
+ "0xff<three>\0");
+
+ // new style, line_max exceeded by named bit-field number in line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0",
+ 0xff,
+ 3,
+ "0x#\0");
+
+ // new style, line_max exceeded by named bit-field '<' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0",
+ 0xff,
+ 4,
+ "0xf#\0");
+
+ // new style, line_max exceeded by bit-field description in line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0",
+ 0xff,
+ 6,
+ "0xff<#\0");
+
+ // new style, line_max exceeded by named bit-field '=' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0",
+ 0xff,
+ 7,
+ "0xff<l#\0");
+
+ // new style, line_max exceeded by named bit-field value in line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0",
+ 0xff,
+ 10,
+ "0xff<lo=0#\0");
+
+ // new style, line_max exceeded by named bit-field '=' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "=\017match\0",
+ 0xff,
+ 12,
+ "0xff<lo=0xf#\0");
+
+ // new style, line_max exceeded by named bit-field value description in
+ // line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "=\017match\0",
+ 0xff,
+ 16,
+ "0xff<lo=0xf=mat#\0");
+
+ // new style, line_max exceeded by named bit-field '>' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "=\017match\0",
+ 0xff,
+ 17,
+ "0xff<lo=0xf=matc#\0");
+
+ // new style, line_max exceeded by named bit-field description in
+ // line 2
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\000\004low-bits\0"
+ "=\017match\0",
+ 0xff,
+ 12,
+ "0xff<lo=0xf>\0"
+ "0xff<low-bi#\0");
+
+ // new style, line_max exceeded by named bit-field '=' in line 2
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\000\004low-bits\0"
+ "=\017match\0",
+ 0xff,
+ 13,
+ "0xff<lo=0xf>\0"
+ "0xff<low-bit#\0");
+
+ // new style, line_max exceeded by named bit-field value in line 2
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\000\004low-bits\0"
+ "=\017match\0",
+ 0xff,
+ 16,
+ "0xff<lo=0xf>\0"
+ "0xff<low-bits=0#\0");
+
+ // new style, line_max exceeded by named bit-field '=' in line 2
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\000\004low-bits\0"
+ "=\017match\0",
+ 0xff,
+ 18,
+ "0xff<lo=0xf>\0"
+ "0xff<low-bits=0xf#\0");
+
+ // new style, line_max exceeded by named bit-field value description
+ // in line 2
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\000\004low-bits\0"
+ "=\017match\0",
+ 0xff,
+ 22,
+ "0xff<lo=0xf>\0"
+ "0xff<low-bits=0xf=mat#\0");
+
+ // new style, line_max exceeded by named bit-field '>' in line 2
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\000\004low-bits\0"
+ "=\017match\0",
+ 0xff,
+ 23,
+ "0xff<lo=0xf>\0"
+ "0xff<low-bits=0xf=matc#\0");
+
+ // new style, named bit-field complete
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004lo\0"
+ "f\000\004low-bits\0"
+ "=\017match\0",
+ 0xff,
+ 24,
+ "0xff<lo=0xf>\0"
+ "0xff<low-bits=0xf=match>\0");
+
+ // new style, line_max exceeded by unnamed bit-field number in line 1
+ h_snprintb_m(
+ "\177\020"
+ "F\000\004\0",
+ 0xff,
+ 3,
+ "0x#\0");
+
+ // new style, line_max exceeded by unnamed bit-field '<' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "F\000\004\0",
+ 0xff,
+ 4,
+ "0xf#\0");
+
+ // new style, line_max exceeded by unnamed bit-field value description
+ // in line 1
+ h_snprintb_m(
+ "\177\020"
+ "F\000\004\0"
+ ":\017match\0",
+ 0xff,
+ 9,
+ "0xff<mat#\0");
+
+ // new style, line_max exceeded by unnamed bit-field '>' in line 1
+ h_snprintb_m(
+ "\177\020"
+ "F\000\004\0"
+ ":\017match\0",
+ 0xff,
+ 10,
+ "0xff<matc#\0");
+
+ // new style, line_max exceeded by unnamed bit-field value description
+ // in line 2
+ h_snprintb_m(
+ "\177\020"
+ "F\000\004\0"
+ ":\017m1\0"
+ ":\017match\0",
+ 0xff,
+ 10,
+ "0xff<m1ma#\0");
+
+ // new style, line_max exceeded by unnamed bit-field '>' in line 2
+ h_snprintb_m(
+ "\177\020"
+ "F\000\004\0"
+ ":\017m1\0"
+ ":\017match\0",
+ 0xff,
+ 10,
+ "0xff<m1ma#\0");
+
+ // new style unnamed bit-field complete
+ h_snprintb_m(
+ "\177\020"
+ "F\000\004\0"
+ ":\017m1\0"
+ ":\017match\0",
+ 0xff,
+ 13,
+ "0xff<m1match>\0");
+
+ // new style, line_max exceeded by bit-field default
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004f\0"
+ "*=default\0",
+ 0xff,
+ 17,
+ "0xff<f=0xf=defau#\0");
+
+ // new style, line_max exceeded by unmatched field value
+ h_snprintb_m(
+ "\177\020"
+ "f\000\004bits\0"
+ "=\000zero\0",
+ 0xff,
+ 11,
+ "0xff<bits=#\0");
+
+ // example from the manual page, new style bits and fields
+ h_snprintb_m(
+ "\177\020"
+ "b\000" "LSB\0"
+ "b\001" "BITONE\0"
+ "f\004\004" "NIBBLE2\0"
+ "f\020\004" "BURST\0"
+ "=\x04" "FOUR\0"
+ "=\x0f" "FIFTEEN\0"
+ "b\037" "MSB\0",
+ 0x800f0701,
+ 34,
+ "0x800f0701<LSB,NIBBLE2=0>\0"
+ "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
+
+ // new style, missing number base
+ h_snprintb_m_len(
+ 1024,
+ "\177",
+ 0xff,
+ 128,
+ -1,
+ "#\0");
+
+ // new style, buffer too small for complete number in line 2
+ h_snprintb_m_len(
+ 15,
+ "\177\020"
+ "b\000lsb\0"
+ "b\001two\0",
+ 0xff,
+ 11,
+ 20,
+ "0xff<lsb>\0"
+ "0x#\0");
+
+ // new-style format, buffer too small for '<' in line 2
+ h_snprintb_m_len(
+ 16,
+ "\177\020"
+ "b\000lsb\0"
+ "b\001two\0",
+ 0xff,
+ 11,
+ 20,
+ "0xff<lsb>\0"
+ "0xf#\0");
+
+ // new-style format, buffer too small for textual fallback
+ h_snprintb_m_len(
+ 24,
+ "\177\020"
+ "f\000\004bits\0"
+ "*=fallback\0"
+ "b\0024\0",
+ 0xff,
+ 64,
+ 26,
+ "0xff<bits=0xf=fallbac#\0");
+
+ // new-style format, buffer too small for numeric fallback
+ h_snprintb_m_len(
+ 20,
+ "\177\020"
+ "F\000\004\0"
+ "*fallback(%040jd)\0",
+ 0xff,
+ 64,
+ 57,
+ "0xff<fallback(000#\0");
+
+ // new-style format, buffer too small for numeric fallback past buffer
+ h_snprintb_m_len(
+ 15,
+ "\177\020"
+ "F\000\004\0"
+ "*fallback(%010jd)\0"
+ "F\004\004\0"
+ "*fallback(%010jd)\0",
+ 0xff,
+ 64,
+ 48,
+ "0xff<fallbac#\0");
+
+ // new style, bits and fields, line break between fields
+ h_snprintb_m(
+ "\177\020"
+ "b\0LSB\0"
+ "b\1_BITONE\0"
+ "f\4\4NIBBLE2\0"
+ "f\x10\4BURST\0"
+ "=\04FOUR\0"
+ "=\17FIFTEEN\0"
+ "b\x1fMSB\0",
+ 0x800f0701,
+ 33,
+ "0x800f0701<LSB,NIBBLE2=0>\0"
+ "0x800f0701<BURST=0xf=FIFTEEN,MSB>\0");
+
+ // new style, bits and fields, line break after field description
+ h_snprintb_m(
+ "\177\020"
+ "b\0LSB\0"
+ "b\1_BITONE\0"
+ "f\4\4NIBBLE2\0"
+ "f\020\4BURST\0"
+ "=\04FOUR\0"
+ "=\17FIFTEEN\0"
+ "b\037MSB\0",
+ 0x800f0701,
+ 32,
+ "0x800f0701<LSB,NIBBLE2=0>\0"
+ "0x800f0701<BURST=0xf=FIFTEEN>\0"
+ "0x800f0701<MSB>\0");
}
ATF_TP_ADD_TCS(tp)
diff --git a/lib/libutil/t_sockaddr_snprintf.c b/lib/libutil/t_sockaddr_snprintf.c
index 42930385e99f..3f323d1c0e19 100644
--- a/lib/libutil/t_sockaddr_snprintf.c
+++ b/lib/libutil/t_sockaddr_snprintf.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_sockaddr_snprintf.c,v 1.4 2022/11/07 08:34:30 msaitoh Exp $ */
+/* $NetBSD: t_sockaddr_snprintf.c,v 1.6 2025/12/24 18:05:23 thorpej Exp $ */
/*
* Copyright (c) 2002, 2004, 2008, 2010 The NetBSD Foundation, Inc.
@@ -31,8 +31,9 @@
#include <sys/cdefs.h>
__COPYRIGHT("@(#) Copyright (c) 2008, 2010\
The NetBSD Foundation, inc. All rights reserved.");
-__RCSID("$NetBSD: t_sockaddr_snprintf.c,v 1.4 2022/11/07 08:34:30 msaitoh Exp $");
+__RCSID("$NetBSD: t_sockaddr_snprintf.c,v 1.6 2025/12/24 18:05:23 thorpej Exp $");
+#include <stdio.h>
#include <sys/socket.h> /* AF_ */
#include <sys/un.h> /* sun */
@@ -40,11 +41,67 @@ __RCSID("$NetBSD: t_sockaddr_snprintf.c,v 1.4 2022/11/07 08:34:30 msaitoh Exp $"
#include <netatalk/at.h> /* sat */
#include <netinet/in.h> /* sin/sin6 */
+#include <netdb.h>
#include <string.h>
#include <util.h>
#include <atf-c.h>
+static void
+make_dl(struct sockaddr_dl *sdl)
+{
+ memset(sdl, 0, sizeof(*sdl));
+ sdl->sdl_len = sizeof(*sdl);
+ sdl->sdl_family = AF_LINK;
+ sdl->sdl_index = 0;
+ sdl->sdl_type = 0;
+ sdl->sdl_nlen = 0;
+ sdl->sdl_alen = 6;
+ sdl->sdl_slen = 0;
+ memcpy(sdl->sdl_data, "\01\02\03\04\05\06", 6);
+}
+
+static void
+make_in4(struct sockaddr_in *sin4)
+{
+ memset(sin4, 0, sizeof(*sin4));
+ sin4->sin_len = sizeof(*sin4);
+ sin4->sin_family = AF_INET;
+ sin4->sin_port = ntohs(80);
+ sin4->sin_addr.s_addr = ntohl(INADDR_LOOPBACK);
+}
+
+#ifdef INET6
+static void
+make_in6(struct sockaddr_in6 *sin6)
+{
+ memset(sin6, 0, sizeof(*sin6));
+ sin6->sin6_len = sizeof(*sin6);
+ sin6->sin6_family = AF_INET6;
+ sin6->sin6_port = ntohs(80);
+ sin6->sin6_addr = in6addr_nodelocal_allnodes;
+}
+#endif
+
+static void
+make_at(struct sockaddr_at *sat)
+{
+ memset(sat, 0, sizeof(*sat));
+ sat->sat_len = sizeof(*sat);
+ sat->sat_family = AF_APPLETALK;
+ sat->sat_addr.s_net = ntohs(101);
+ sat->sat_addr.s_node = 3;
+}
+
+static void
+make_un(struct sockaddr_un *sun)
+{
+ memset(sun, 0, sizeof(*sun));
+ sun->sun_len = sizeof(*sun);
+ sun->sun_family = AF_UNIX;
+ strncpy(sun->sun_path, "/tmp/sock", sizeof(sun->sun_path));
+}
+
ATF_TC(sockaddr_snprintf_in);
ATF_TC_HEAD(sockaddr_snprintf_in, tc)
{
@@ -57,11 +114,8 @@ ATF_TC_BODY(sockaddr_snprintf_in, tc)
struct sockaddr_in sin4;
int i;
- memset(&sin4, 0, sizeof(sin4));
- sin4.sin_len = sizeof(sin4);
- sin4.sin_family = AF_INET;
- sin4.sin_port = ntohs(80);
- sin4.sin_addr.s_addr = ntohl(INADDR_LOOPBACK);
+ make_in4(&sin4);
+
i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %p %a",
(struct sockaddr *)&sin4);
@@ -82,11 +136,8 @@ ATF_TC_BODY(sockaddr_snprintf_in6, tc)
struct sockaddr_in6 sin6;
int i;
- memset(&sin6, 0, sizeof(sin6));
- sin6.sin6_len = sizeof(sin6);
- sin6.sin6_family = AF_INET6;
- sin6.sin6_port = ntohs(80);
- sin6.sin6_addr = in6addr_nodelocal_allnodes;
+ make_in6(&sin6);
+
i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %p %a",
(struct sockaddr *)&sin6);
@@ -109,10 +160,8 @@ ATF_TC_BODY(sockaddr_snprintf_un, tc)
struct sockaddr_un sun;
int i;
- memset(&sun, 0, sizeof(sun));
- sun.sun_len = sizeof(sun);
- sun.sun_family = AF_UNIX;
- strncpy(sun.sun_path, "/tmp/sock", sizeof(sun.sun_path));
+ make_un(&sun);
+
i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a",
(struct sockaddr *)&sun);
@@ -132,11 +181,8 @@ ATF_TC_BODY(sockaddr_snprintf_at, tc)
struct sockaddr_at sat;
int i;
- memset(&sat, 0, sizeof(sat));
- sat.sat_len = sizeof(sat);
- sat.sat_family = AF_APPLETALK;
- sat.sat_addr.s_net = ntohs(101);
- sat.sat_addr.s_node = 3;
+ make_at(&sat);
+
i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a",
(struct sockaddr *)&sat);
@@ -156,15 +202,8 @@ ATF_TC_BODY(sockaddr_snprintf_dl, tc)
struct sockaddr_dl sdl;
int i;
- memset(&sdl, 0, sizeof(sdl));
- sdl.sdl_len = sizeof(sdl);
- sdl.sdl_family = AF_LINK;
- sdl.sdl_index = 0;
- sdl.sdl_type = 0;
- sdl.sdl_nlen = 0;
- sdl.sdl_alen = 6;
- sdl.sdl_slen = 0;
- memcpy(sdl.sdl_data, "\01\02\03\04\05\06", 6);
+ make_dl(&sdl);
+
i = sockaddr_snprintf(buf, sizeof(buf), "%f %l %a",
(struct sockaddr *)&sdl);
@@ -172,6 +211,71 @@ ATF_TC_BODY(sockaddr_snprintf_dl, tc)
ATF_REQUIRE_STREQ(buf, "18 32 1.2.3.4.5.6");
}
+
+ATF_TC(sockaddr_snprintf_generic);
+ATF_TC_HEAD(sockaddr_snprintf_generic, tc)
+{
+ atf_tc_set_md_var(tc, "descr",
+ "Checks sockaddr_snprintf(3) with generic args");
+}
+ATF_TC_BODY(sockaddr_snprintf_generic, tc)
+{
+ char buf[1024];
+ struct sockaddr_at sat;
+ struct sockaddr_dl sdl;
+ struct sockaddr_un sun;
+ struct sockaddr_in sin4;
+#ifdef INET6
+ struct sockaddr_in6 sin6;
+#endif
+ struct addrinfo *res;
+ int i;
+
+
+#define CHECK(a, b) \
+ ATF_REQUIRE_EQ_MSG(i, (a), "bad length"); \
+ ATF_REQUIRE_STREQ(buf, (b))
+
+ make_dl(&sdl);
+ i = sockaddr_snprintf(buf, sizeof(buf), "%n",
+ (struct sockaddr *)&sdl);
+ CHECK(11, "1.2.3.4.5.6");
+
+#ifdef INET6
+ make_in6(&sin6);
+ i = sockaddr_snprintf(buf, sizeof(buf), "%n",
+ (struct sockaddr *)&sin6);
+ CHECK(12, "[ff01::1]:80");
+#endif
+
+ make_in4(&sin4);
+ i = sockaddr_snprintf(buf, sizeof(buf), "%n",
+ (struct sockaddr *)&sin4);
+ CHECK(12, "127.0.0.1:80");
+
+ make_at(&sat);
+ i = sockaddr_snprintf(buf, sizeof(buf), "%n",
+ (struct sockaddr *)&sat);
+ CHECK(7, "101.3:0");
+
+ make_un(&sun);
+ i = sockaddr_snprintf(buf, sizeof(buf), "%n",
+ (struct sockaddr *)&sun);
+ CHECK(9, "/tmp/sock");
+
+ if (getaddrinfo("morden.netbsd.org", "https", NULL, &res) == 0) {
+ for (struct addrinfo *ai = res; ai; ai = ai->ai_next) {
+ i = sockaddr_snprintf(buf, sizeof(buf), "%N",
+ ai->ai_addr);
+ if (strcmp(buf, "morden.netbsd.org:https") == 0 ||
+ strcmp(buf, "ftp.NetBSD.org:https") == 0)
+ continue;
+ fprintf(stderr, "Unexpected %s\n", buf);
+ }
+ freeaddrinfo(res);
+ }
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -180,6 +284,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, sockaddr_snprintf_un);
ATF_TP_ADD_TC(tp, sockaddr_snprintf_at);
ATF_TP_ADD_TC(tp, sockaddr_snprintf_dl);
+ ATF_TP_ADD_TC(tp, sockaddr_snprintf_generic);
return atf_no_error();
}
diff --git a/libexec/ld.elf_so/Makefile b/libexec/ld.elf_so/Makefile
index 7ed123b099ca..9c373a98a76f 100644
--- a/libexec/ld.elf_so/Makefile
+++ b/libexec/ld.elf_so/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.21 2023/07/30 09:22:02 riastradh Exp $
+# $NetBSD: Makefile,v 1.35 2025/12/21 19:08:09 riastradh Exp $
#
NOMAN= # defined
@@ -7,11 +7,19 @@ NOMAN= # defined
.if ${MKPIC} != "no"
-SUBDIR+= helper_dso1 helper_dso3 .WAIT helper_dso2 .WAIT \
- helper_ifunc_dso \
- helper_symver_dso0 .WAIT helper_symver_dso1 .WAIT \
- helper_symver_dso2 .WAIT \
- data
+SUBDIR+= helper_dso1
+SUBDIR+= helper_dso3
+SUBDIR+= .WAIT
+SUBDIR+= helper_dso2
+SUBDIR+= .WAIT
+SUBDIR+= helper_ifunc_dso
+SUBDIR+= helper_symver_dso0
+SUBDIR+= .WAIT
+SUBDIR+= helper_symver_dso1
+SUBDIR+= .WAIT
+SUBDIR+= helper_symver_dso2
+SUBDIR+= .WAIT
+SUBDIR+= data
SUBDIR+= helper_def_dynamic
SUBDIR+= helper_def_static
@@ -27,10 +35,42 @@ SUBDIR+= helper_use_static
TESTSDIR= ${TESTSBASE}/libexec/ld.elf_so
-TESTS_C+= t_dlerror-cleared t_dlerror-false t_dlinfo t_dlvsym t_ifunc
+TESTS_C+= t_dladdr
+TESTS_C+= t_dlclose_thread
+TESTS_C+= t_dlerror-cleared
+TESTS_C+= t_dlerror-false
+TESTS_C+= t_dlinfo
+TESTS_C+= t_dlvsym
+TESTS_C+= t_hash
+TESTS_C+= t_ifunc
+TESTS_C+= t_ifunc_norelro
+TESTS_C+= t_ifunc_norelro_now
+TESTS_C+= t_ifunc_now
TESTS_C+= t_rtld_r_debug
+TESTS_C+= t_rtld_r_debug_nopie
TESTS_C+= t_tls_extern
-TESTS_C+= t_hash
+TESTS_C+= t_tls_alignment
+
+LDFLAGS.t_dladdr+= -Wl,-export-dynamic
+
+SRCS.t_ifunc_now= t_ifunc.c
+SRCS.t_ifunc_norelro= t_ifunc.c
+SRCS.t_ifunc_norelro_now= t_ifunc.c
+
+LDADD.t_dlclose_thread+= -lpthread
+LDADD.t_dlclose_thread+= -Wl,-rpath,${TESTSDIR}
+LDADD.t_dlclose_thread+= -Wl,--export-dynamic
+
+LDADD.t_ifunc+= ${${MKRELRO} != "no":?-Wl,-z,relro:}
+LDADD.t_ifunc_now+= ${${MKRELRO} != "no":?-Wl,-z,relro:} -Wl,-z,now
+LDADD.t_ifunc_norelro+= ${${MKRELRO} != "no":?-Wl,-z,norelro:}
+LDADD.t_ifunc_norelro_now+= ${${MKRELRO} != "no":?-Wl,-z,norelro:} -Wl,-z,now
+
+SRCS.t_rtld_r_debug_nopie= t_rtld_r_debug.c
+
+# If the port doesn't support PIE anyway, well, no big deal, we have
+# two copies of the same tiny test.
+LDADD.t_rtld_r_debug_nopie+= -Wl,-no-pie
.PATH: ${NETBSDSRCDIR}/libexec/ld.elf_so
SRCS.t_hash+= t_hash.c
@@ -41,11 +81,16 @@ COPTS.t_rtld_r_debug.c += ${CC_WNO_MAYBE_UNINITIALIZED}
LDADD.t_dlerror-false= -Wl,-rpath,/var/nonexistent/lib
LDADD.t_dlvsym= -Wl,-rpath,${TESTSDIR}/h_helper_symver_dso2
-LDADD.t_ifunc= -Wl,-rpath,${TESTSDIR} -lutil
-DPADD.t_ifunc= ${LIBUTIL}
+.for t in t_ifunc t_ifunc_now t_ifunc_norelro t_ifunc_norelro_now
+LDADD.${t}+= -Wl,-rpath,${TESTSDIR} -lutil
+DPADD.${t}+= ${LIBUTIL}
+.endfor
LDADD.t_tls_extern+= -Wl,-rpath,${TESTSDIR}
-TESTS_SH+= t_df_1_noopen t_dl_symver t_thread_local_dtor
+TESTS_SH+= t_df_1_noopen
+TESTS_SH+= t_dl_symver
+TESTS_SH+= t_r_rel
+TESTS_SH+= t_thread_local_dtor
BINDIR= ${TESTSDIR}
PROGS+= h_df_1_noopen1
@@ -82,6 +127,18 @@ SRCS.h_dl_symver_v2= h_dl_symver.c
V2ODIR!= cd ${.CURDIR}/helper_symver_dso2 && ${PRINTOBJDIR}
LDADD.h_dl_symver_v2= -L${V2ODIR} -lh_helper_symver_dso
+PROGS+= h_r_rel_pack
+PROGS+= h_r_rel_nopack
+
+SRCS.h_r_rel_pack= h_r_rel.c
+SRCS.h_r_rel_nopack= h_r_rel.c
+
+h_r_rel_pack: CTFMERGE=: # PR toolchain/59364: ctf tools needs update
+h_r_rel_pack.link: CTFMERGE=: # PR toolchain/59364: ctf tools needs update
+COPTS.h_r_rel.c+= -fpie
+LDFLAGS.h_r_rel_pack= -pie ${LD_PACK_RELATIVE_RELOCS}
+LDFLAGS.h_r_rel_nopack= -pie ${LD_NOPACK_RELATIVE_RELOCS}
+
.include <bsd.test.mk>
.else
diff --git a/libexec/ld.elf_so/t_dlinfo.c b/libexec/ld.elf_so/t_dlinfo.c
index e7db9712963e..44be798d7fe0 100644
--- a/libexec/ld.elf_so/t_dlinfo.c
+++ b/libexec/ld.elf_so/t_dlinfo.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_dlinfo.c,v 1.6 2019/07/09 16:24:01 maya Exp $ */
+/* $NetBSD: t_dlinfo.c,v 1.8 2023/11/24 17:40:20 riastradh Exp $ */
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -46,7 +46,7 @@ ATF_TC_BODY(rtld_dlinfo_linkmap_self, tc)
int rv;
rv = dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map);
- ATF_CHECK_EQ(rv, 0);
+ ATF_REQUIRE_EQ_MSG(rv, 0, "dlinfo: %s", dlerror());
ATF_CHECK((strstr(map->l_name, "t_dlinfo") != NULL));
}
@@ -61,7 +61,7 @@ ATF_TC_BODY(rtld_dlinfo_linkmap_inval, tc)
int rv;
rv = dlinfo(NULL, RTLD_DI_LINKMAP, &v);
- ATF_CHECK_EQ(rv, -1);
+ ATF_CHECK_EQ_MSG(rv, -1, "rv=%d", rv);
}
ATF_TC(rtld_dlinfo_linkmap_dlopen);
@@ -76,12 +76,12 @@ ATF_TC_BODY(rtld_dlinfo_linkmap_dlopen, tc)
int rv;
handle = dlopen("libutil.so", RTLD_LAZY);
- ATF_CHECK(handle);
+ ATF_REQUIRE_MSG(handle, "dlopen: %s", dlerror());
rv = dlinfo(handle, RTLD_DI_LINKMAP, &map);
- ATF_CHECK_EQ(rv, 0);
+ ATF_REQUIRE_EQ_MSG(rv, 0, "dlinfo: %s", dlerror());
ATF_CHECK((strstr(map->l_name, "libutil.so") != NULL));
- dlclose(handle);
+ ATF_CHECK_EQ_MSG(dlclose(handle), 0, "dlclose: %s", dlerror());
}
ATF_TC(rtld_dlinfo_linkmap_dlopen_iter);
@@ -95,19 +95,20 @@ ATF_TC_BODY(rtld_dlinfo_linkmap_dlopen_iter, tc)
void *handle;
handle = dlopen("libutil.so", RTLD_LAZY);
- ATF_CHECK(handle);
+ ATF_REQUIRE_MSG(handle, "dlopen: %s", dlerror());
- RZ(dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map));
+ ATF_REQUIRE_EQ_MSG(dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map), 0,
+ "dlinfo: %s", dlerror());
for (; map->l_next; map = map->l_next)
continue;
for (; map; map = map->l_prev)
if (strstr(map->l_name, "libutil.so") != NULL)
break;
-
+
ATF_REQUIRE_MSG(map, "dlopen()d object not found from linkmap");
ATF_REQUIRE_MSG(dlopen(map->l_name, RTLD_LAZY) != NULL,
- "could not dlopen() name in linkmap");
+ "could not dlopen() name in linkmap: %s", dlerror());
}
ATF_TP_ADD_TCS(tp)
diff --git a/libexec/ld.elf_so/t_hash.c b/libexec/ld.elf_so/t_hash.c
index e78ea9e2160b..f21fa396ddba 100644
--- a/libexec/ld.elf_so/t_hash.c
+++ b/libexec/ld.elf_so/t_hash.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_hash.c,v 1.1 2023/07/30 09:22:02 riastradh Exp $ */
+/* $NetBSD: t_hash.c,v 1.2 2025/04/16 02:27:17 riastradh Exp $ */
/*-
* Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -44,6 +44,7 @@ struct kat {
* illustrate the problem on all systems, not just LP64 ones.
*
* https://www.sco.com/developers/devspecs/gabi41.pdf#page=95
+ * https://web.archive.org/web/20241216221811/https://www.sco.com/developers/devspecs/gabi41.pdf#page=95
*/
static uint64_t
sysv_broken_hash(const char *name)
diff --git a/libexec/ld.elf_so/t_rtld_r_debug.c b/libexec/ld.elf_so/t_rtld_r_debug.c
index 6a2ff8716b24..1dd333b4cd9c 100644
--- a/libexec/ld.elf_so/t_rtld_r_debug.c
+++ b/libexec/ld.elf_so/t_rtld_r_debug.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_rtld_r_debug.c,v 1.3 2020/09/29 16:35:42 roy Exp $ */
+/* $NetBSD: t_rtld_r_debug.c,v 1.12 2025/04/16 12:05:52 riastradh Exp $ */
/*
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -27,6 +27,9 @@
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: t_rtld_r_debug.c,v 1.12 2025/04/16 12:05:52 riastradh Exp $");
+
#include <sys/types.h>
#include <atf-c.h>
@@ -60,13 +63,24 @@ get_dynamic_section(void)
phdr = (void *)getauxval(AT_PHDR);
phnum = (Elf_Half)getauxval(AT_PHNUM);
- ATF_CHECK(phdr != NULL);
- ATF_CHECK(phnum != (Elf_Half)~0);
+ printf("AT_PHDR=%p\n", phdr);
+ printf("AT_PHNUM=%d\n", phnum);
+
+ ATF_REQUIRE(phdr != NULL);
+ ATF_REQUIRE(phnum != (Elf_Half)~0);
phlimit = phdr + phnum;
dynphdr = NULL;
for (; phdr < phlimit; ++phdr) {
+ printf("phdr %p: type=%d flags=0x%x"
+ " vaddr=0x%lx paddr=0x%lx"
+ " filesz=0x%lx memsz=0x%lx"
+ " align=0x%lx\n",
+ phdr, phdr->p_type, phdr->p_flags,
+ (long)phdr->p_vaddr, (long)phdr->p_paddr,
+ (long)phdr->p_filesz, (long)phdr->p_memsz,
+ (long)phdr->p_align);
if (phdr->p_type == PT_DYNAMIC)
dynphdr = phdr;
if (phdr->p_type == PT_PHDR)
@@ -76,35 +90,51 @@ get_dynamic_section(void)
return (Elf_Dyn *)((uint8_t *)dynphdr->p_vaddr + relocbase);
}
-static struct r_debug *
+static const struct r_debug *
get_rtld_r_debug(void)
{
- struct r_debug *debug = NULL;
+ const struct r_debug *debug = NULL;
Elf_Dyn *dynp;
for (dynp = get_dynamic_section(); dynp->d_tag != DT_NULL; dynp++) {
+ printf("dynp %p: tag=%ld val=0x%lx\n", dynp,
+ (long)dynp->d_tag, (long)dynp->d_un.d_val);
+#ifdef __mips__
+ if (dynp->d_tag == DT_MIPS_RLD_MAP) {
+ debug = (const void *)*(Elf_Addr *)dynp->d_un.d_ptr;
+ break;
+ }
+ if (dynp->d_tag == DT_MIPS_RLD_MAP_REL) {
+ debug = (const void *)*(Elf_Addr *)((Elf_Addr)dynp +
+ dynp->d_un.d_val);
+ break;
+ }
+#else
if (dynp->d_tag == DT_DEBUG) {
debug = (void *)dynp->d_un.d_val;
break;
}
+#endif
}
- ATF_CHECK(debug != NULL);
+ ATF_REQUIRE(debug != NULL);
return debug;
}
static void
-check_r_debug_return_link_map(const char *name, struct link_map **rmap)
+check_r_debug_return_link_map(const char *name, const struct link_map **rmap)
{
- struct r_debug *debug;
- struct link_map *map;
+ const struct r_debug *debug;
+ const struct link_map *map;
void *loader;
bool found;
loader = NULL;
debug = get_rtld_r_debug();
- ATF_CHECK(debug != NULL);
- ATF_CHECK(debug->r_version == R_DEBUG_VERSION);
+ ATF_REQUIRE(debug != NULL);
+ ATF_CHECK_EQ_MSG(debug->r_version, R_DEBUG_VERSION,
+ "debug->r_version=%d R_DEBUG_VERSION=%d",
+ debug->r_version, R_DEBUG_VERSION);
map = debug->r_map;
ATF_CHECK(map != NULL);
@@ -120,8 +150,12 @@ check_r_debug_return_link_map(const char *name, struct link_map **rmap)
ATF_CHECK(found);
ATF_CHECK(loader != NULL);
ATF_CHECK(debug->r_brk != NULL);
- ATF_CHECK(debug->r_state == RT_CONSISTENT);
- ATF_CHECK(debug->r_ldbase == loader);
+ ATF_CHECK_EQ_MSG(debug->r_state, RT_CONSISTENT,
+ "debug->r_state=%d RT_CONSISTENT=%d",
+ debug->r_state, RT_CONSISTENT);
+ ATF_CHECK_EQ_MSG(debug->r_ldbase, loader,
+ "debug->r_ldbase=%p loader=%p",
+ debug->r_ldbase, loader);
}
ATF_TC(self);
@@ -138,22 +172,23 @@ ATF_TC(dlopen);
ATF_TC_HEAD(dlopen, tc)
{
atf_tc_set_md_var(tc, "descr",
- "check whether r_debug is well-formed after an dlopen(3) call");
+ "check whether r_debug is well-formed after a dlopen(3) call");
}
ATF_TC_BODY(dlopen, tc)
{
void *handle;
- struct link_map *map, *r_map;
+ const struct link_map *r_map, *map;
handle = dlopen("libutil.so", RTLD_LAZY);
- ATF_CHECK(handle);
+ ATF_REQUIRE_MSG(handle, "dlopen: %s", dlerror());
check_r_debug_return_link_map("libutil.so", &r_map);
- RZ(dlinfo(handle, RTLD_DI_LINKMAP, &map));
+ ATF_REQUIRE_EQ_MSG(dlinfo(handle, RTLD_DI_LINKMAP, &map), 0,
+ "dlinfo: %s", dlerror());
- ATF_CHECK(map == r_map);
- dlclose(handle);
+ ATF_CHECK_EQ_MSG(map, r_map, "map=%p r_map=%p", map, r_map);
+ ATF_CHECK_EQ_MSG(dlclose(handle), 0, "dlclose: %s", dlerror());
}
ATF_TP_ADD_TCS(tp)
diff --git a/libexec/ld.elf_so/t_tls_extern.c b/libexec/ld.elf_so/t_tls_extern.c
index 00a9c767591c..f25be3eb08a5 100644
--- a/libexec/ld.elf_so/t_tls_extern.c
+++ b/libexec/ld.elf_so/t_tls_extern.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_tls_extern.c,v 1.12 2023/06/04 01:24:58 joerg Exp $ */
+/* $NetBSD: t_tls_extern.c,v 1.16 2024/07/23 18:11:53 riastradh Exp $ */
/*-
* Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
#include <atf-c.h>
#include <dlfcn.h>
-#define ATF_REQUIRE_DL(x) ATF_REQUIRE_MSG(x, "%s: %s", #x, dlerror())
+#define ATF_REQUIRE_DL(x) ATF_REQUIRE_MSG((x) != 0, "%s: %s", #x, dlerror())
enum order {
DEF_USE_EAGER,
@@ -382,6 +382,63 @@ ATF_TC_BODY(onlydef_static_dynamic_lazy, tc)
pstatic, pdynamic);
}
+ATF_TC(opencloseloop_use);
+ATF_TC_HEAD(opencloseloop_use, tc)
+{
+ atf_tc_set_md_var(tc, "descr", "Testing opening and closing in a loop,"
+ " then opening and using dynamic TLS");
+}
+ATF_TC_BODY(opencloseloop_use, tc)
+{
+ unsigned i;
+ void *def, *use;
+ int *(*fdef)(void), *(*fuse)(void);
+ int *pdef, *puse;
+
+ /*
+ * Open and close the definition library repeatedly. This
+ * should trigger allocation of many DTV offsets, which are
+ * (currently) not recycled, so the required DTV offsets should
+ * become very long -- pages past what is actually allocated
+ * before we attempt to use it.
+ *
+ * This way, we will exercise the wrong-way-conditional fast
+ * path of PR lib/58154.
+ */
+ for (i = sysconf(_SC_PAGESIZE); i --> 0;) {
+ ATF_REQUIRE_DL(def = dlopen("libh_def_dynamic.so", 0));
+ ATF_REQUIRE_EQ_MSG(dlclose(def), 0,
+ "dlclose(def): %s", dlerror());
+ }
+
+ /*
+ * Now open the definition library and keep it open.
+ */
+ ATF_REQUIRE_DL(def = dlopen("libh_def_dynamic.so", 0));
+ ATF_REQUIRE_DL(fdef = dlsym(def, "fdef"));
+
+ /*
+ * Open libraries that use the definition and verify they
+ * observe the same pointer.
+ */
+ ATF_REQUIRE_DL(use = dlopen("libh_use_dynamic.so", 0));
+ ATF_REQUIRE_DL(fuse = dlsym(use, "fuse"));
+ pdef = (*fdef)();
+ puse = (*fuse)();
+ ATF_CHECK_EQ_MSG(pdef, puse,
+ "%p in defining library != %p in using library",
+ pdef, puse);
+
+ /*
+ * Also verify the pointer can be used.
+ */
+ *pdef = 123;
+ *puse = 456;
+ ATF_CHECK_EQ_MSG(*pdef, *puse,
+ "%d in defining library != %d in using library",
+ *pdef, *puse);
+}
+
ATF_TP_ADD_TCS(tp)
{
@@ -398,6 +455,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, onlydef_dynamic_static_lazy);
ATF_TP_ADD_TC(tp, onlydef_static_dynamic_eager);
ATF_TP_ADD_TC(tp, onlydef_static_dynamic_lazy);
+ ATF_TP_ADD_TC(tp, opencloseloop_use);
ATF_TP_ADD_TC(tp, static_abusedef);
ATF_TP_ADD_TC(tp, static_abusedefnoload);
ATF_TP_ADD_TC(tp, static_defabuse_eager);
diff --git a/modules/t_abi_uvm.sh b/modules/t_abi_uvm.sh
index b855bc831dac..dc89fb8345e4 100644
--- a/modules/t_abi_uvm.sh
+++ b/modules/t_abi_uvm.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_abi_uvm.sh,v 1.3 2012/04/20 05:41:25 jruoho Exp $
+# $NetBSD: t_abi_uvm.sh,v 1.4 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -58,7 +58,7 @@ PAGE_SIZE_body() {
echo "Module PAGE_SIZE: ${module_pagesize}"
atf_check_equal "${kernel_pagesize}" "${module_pagesize}"
- atf_check -s eq:0 -o empty -e empty modunload k_uvm
+ atf_check -s exit:0 -o empty -e empty modunload k_uvm
}
PAGE_SIZE_cleanup() {
modunload k_uvm >/dev/null 2>&1 || true
diff --git a/modules/t_klua_pr_52864.sh b/modules/t_klua_pr_52864.sh
index d5bf58c4de56..50b97170035d 100644
--- a/modules/t_klua_pr_52864.sh
+++ b/modules/t_klua_pr_52864.sh
@@ -1,5 +1,5 @@
#! /usr/bin/atf-sh
-# $NetBSD: t_klua_pr_52864.sh,v 1.3 2023/03/01 21:08:38 nia Exp $
+# $NetBSD: t_klua_pr_52864.sh,v 1.4 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2018 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -41,10 +41,10 @@ luastate_body() {
fi
sysctl -q kern.lua.verbose
if [ $? -eq 1 ]; then
- atf_check -s eq:0 modload lua
+ atf_check -s exit:0 modload lua
fi
- atf_check -s eq:0 luactl -q create atfluastate
- atf_check -s eq:0 -o ignore luactl
+ atf_check -s exit:0 luactl -q create atfluastate
+ atf_check -s exit:0 -o ignore luactl
}
luastate_cleanup() {
diff --git a/modules/t_modload.sh b/modules/t_modload.sh
index 561bb6f6d574..e7861ca9256f 100644
--- a/modules/t_modload.sh
+++ b/modules/t_modload.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_modload.sh,v 1.13 2012/04/20 05:41:25 jruoho Exp $
+# $NetBSD: t_modload.sh,v 1.14 2024/04/28 07:27:41 rillig Exp $
#
# Copyright (c) 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -27,7 +27,7 @@
check_sysctl() {
echo "${1} = ${2}" >expout
- atf_check -s eq:0 -o file:expout -e empty sysctl ${1}
+ atf_check -s exit:0 -o file:expout -e empty sysctl ${1}
}
atf_test_case plain cleanup
@@ -49,14 +49,14 @@ plain_body() {
cat >experr <<EOF
modload: No such file or directory
EOF
- atf_check -s eq:1 -o empty -e ignore modload non-existent.o
+ atf_check -s exit:1 -o empty -e ignore modload non-existent.o
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
modload $(atf_get_srcdir)/k_helper/k_helper.kmod
check_sysctl vendor.k_helper.present 1
check_sysctl vendor.k_helper.prop_int_ok 0
check_sysctl vendor.k_helper.prop_str_ok 0
- atf_check -s eq:0 -o empty -e empty modunload k_helper
+ atf_check -s exit:0 -o empty -e empty modunload k_helper
touch done
}
plain_cleanup() {
@@ -71,29 +71,29 @@ bflag_head() {
bflag_body() {
echo "Checking error conditions"
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
modload -b foo k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid parameter.*foo' stderr
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
modload -b foo= k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid boolean value' stderr
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
modload -b foo=bar k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid boolean value.*bar' stderr
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
modload -b foo=falsea k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid boolean value.*falsea' stderr
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
modload -b foo=truea k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid boolean value.*truea' stderr
# TODO Once sysctl(8) supports CTLTYPE_BOOL nodes.
@@ -121,35 +121,35 @@ iflag_body() {
echo "Checking error conditions"
- atf_check -s eq:1 -o empty -e save:stderr modload -i foo \
+ atf_check -s exit:1 -o empty -e save:stderr modload -i foo \
k_helper/k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid parameter.*foo' stderr
- atf_check -s eq:1 -o empty -e save:stderr modload -i foo= \
+ atf_check -s exit:1 -o empty -e save:stderr modload -i foo= \
k_helper/k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid integer value' stderr
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
modload -i foo=bar k_helper/k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid integer value.*bar' stderr
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
modload -i foo=123a k_helper/k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid integer value.*123a' stderr
echo "Checking valid values"
for v in 5 10; do
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
modload -i prop_int="${v}" \
$(atf_get_srcdir)/k_helper/k_helper.kmod
check_sysctl vendor.k_helper.prop_int_ok 1
check_sysctl vendor.k_helper.prop_int_val "${v}"
- atf_check -s eq:0 -o empty -e empty modunload k_helper
+ atf_check -s exit:0 -o empty -e empty modunload k_helper
done
touch done
}
@@ -175,20 +175,20 @@ sflag_body() {
echo "Checking error conditions"
- atf_check -s eq:1 -o empty -e save:stderr modload -s foo \
+ atf_check -s exit:1 -o empty -e save:stderr modload -s foo \
k_helper/k_helper.kmod
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep 'Invalid parameter.*foo' stderr
echo "Checking valid values"
for v in '1st string' '2nd string'; do
- atf_check -s eq:0 -o empty -e empty \
+ atf_check -s exit:0 -o empty -e empty \
modload -s prop_str="${v}" \
$(atf_get_srcdir)/k_helper/k_helper.kmod
check_sysctl vendor.k_helper.prop_str_ok 1
check_sysctl vendor.k_helper.prop_str_val "${v}"
- atf_check -s eq:0 -o empty -e empty modunload k_helper
+ atf_check -s exit:0 -o empty -e empty modunload k_helper
done
touch done
}
diff --git a/modules/t_threadpool.sh b/modules/t_threadpool.sh
index ab84e4f316e2..6a70c6b0d314 100644
--- a/modules/t_threadpool.sh
+++ b/modules/t_threadpool.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_threadpool.sh,v 1.1 2019/01/25 18:34:45 christos Exp $
+# $NetBSD: t_threadpool.sh,v 1.3 2024/09/08 09:36:53 rillig Exp $
#
# Copyright (c) 2018 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -37,16 +37,16 @@ job_delay=2
read_sysctl() {
echo "${1} = ${2}" >expout
- atf_check -s eq:0 -o file:expout -e empty sysctl ${1}
+ atf_check -s exit:0 -o file:expout -e empty sysctl ${1}
}
write_sysctl() {
- atf_check -s eq:0 -o ignore -e empty sysctl -w "${1}=${2}"
+ atf_check -s exit:0 -o ignore -e empty sysctl -w "${1}=${2}"
}
write_sysctl_fail() {
echo "${3}" >experr
- atf_check -s eq:1 -o ignore -e file:experr sysctl -w "${1}=${2}"
+ atf_check -s exit:1 -o ignore -e file:experr sysctl -w "${1}=${2}"
}
atf_test_case unbound cleanup
@@ -105,7 +105,7 @@ percpu_body() {
# Ensure that the state is clean.
read_sysctl kern.threadpool_tester.test_value 0
- # Create an percpu pool.
+ # Create a percpu pool.
write_sysctl kern.threadpool_tester.get_percpu $tp_pri
# Do it again. We expect this to fail, but the test jig will
diff --git a/net/Makefile b/net/Makefile
index 8cb9ff39002b..1eae1bfa3d63 100644
--- a/net/Makefile
+++ b/net/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.41 2022/11/17 08:45:35 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.42 2024/08/20 08:20:19 ozaki-r Exp $
.include <bsd.own.mk>
@@ -7,7 +7,7 @@ TESTSDIR= ${TESTSBASE}/net
TESTS_SUBDIRS= fdpass in_cksum net sys
.if (${MKRUMP} != "no") && !defined(BSD_MK_COMPAT_FILE)
TESTS_SUBDIRS+= altq arp bpf bpfilter can carp icmp if if_bridge if_gif
-TESTS_SUBDIRS+= if_ipsec if_l2tp if_lagg if_loop if_pppoe if_tap
+TESTS_SUBDIRS+= if_ipsec if_l2tp if_lagg if_loop if_pppoe if_shmif if_tap
TESTS_SUBDIRS+= if_tun if_vether if_vlan if_wg inpcb ipsec mcast mpls
TESTS_SUBDIRS+= ndp npf route tcp
.if (${MKSLJIT} != "no")
diff --git a/net/arp/t_arp.sh b/net/arp/t_arp.sh
index d0cd11926ecb..e0aa1a672a62 100644
--- a/net/arp/t_arp.sh
+++ b/net/arp/t_arp.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_arp.sh,v 1.45 2020/09/18 16:33:49 roy Exp $
+# $NetBSD: t_arp.sh,v 1.49 2025/08/18 06:48:29 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -39,72 +39,6 @@ IP4DST_FAIL2=10.0.99.99
DEBUG=${DEBUG:-false}
TIMEOUT=1
-atf_test_case arp_cache_expiration cleanup
-atf_test_case arp_command cleanup
-atf_test_case arp_garp cleanup
-atf_test_case arp_garp_without_dad cleanup
-atf_test_case arp_cache_overwriting cleanup
-atf_test_case arp_proxy_arp_pub cleanup
-atf_test_case arp_proxy_arp_pubproxy cleanup
-atf_test_case arp_link_activation cleanup
-atf_test_case arp_static cleanup
-
-arp_cache_expiration_head()
-{
- atf_set "descr" "Tests for ARP cache expiration"
- atf_set "require.progs" "rump_server"
-}
-
-arp_command_head()
-{
- atf_set "descr" "Tests for arp_commands of arp(8)"
- atf_set "require.progs" "rump_server"
-}
-
-arp_garp_head()
-{
- atf_set "descr" "Tests for GARP"
- atf_set "require.progs" "rump_server"
-}
-
-arp_garp_without_dad_head()
-{
-
- atf_set "descr" "Tests for GARP with DAD disabled"
- atf_set "require.progs" "rump_server"
-}
-
-arp_cache_overwriting_head()
-{
- atf_set "descr" "Tests for behavior of overwriting ARP caches"
- atf_set "require.progs" "rump_server"
-}
-
-arp_proxy_arp_pub_head()
-{
- atf_set "descr" "Tests for Proxy ARP (pub)"
- atf_set "require.progs" "rump_server"
-}
-
-arp_proxy_arp_pubproxy_head()
-{
- atf_set "descr" "Tests for Proxy ARP (pub proxy)"
- atf_set "require.progs" "rump_server"
-}
-
-arp_link_activation_head()
-{
- atf_set "descr" "Tests for activating a new MAC address"
- atf_set "require.progs" "rump_server"
-}
-
-arp_static_head()
-{
-
- atf_set "descr" "Tests for static ARP entries"
- atf_set "require.progs" "rump_server"
-}
-
setup_dst_server()
{
@@ -155,7 +89,7 @@ get_timeout()
echo $timeout
}
-arp_cache_expiration_body()
+test_cache_expiration()
{
local arp_keep=7
@@ -212,7 +146,7 @@ check_arp_static_entry()
fi
}
-arp_command_body()
+test_command()
{
local arp_keep=5
local bonus=2
@@ -383,22 +317,51 @@ test_garp_common()
atf_check -s exit:0 -o not-match:"$pkt" cat ./out
fi
+ #
+ # GARP on Link up
+ #
+ atf_check -s exit:0 rump.ifconfig shmif0 media none
+ extract_new_packets bus1 > ./out
+ atf_check -s exit:0 rump.ifconfig shmif0 media auto
+
+ atf_check -s exit:0 sleep 1
+ extract_new_packets bus1 > ./out
+
+ if $no_dad; then
+ # A GARP packet is sent for both primary and alias addresses.
+ pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+ pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+ else
+ # No GARP is sent.
+ pkt=$(make_pkt_str_arpreq 10.0.0.3 10.0.0.3)
+ atf_check -s exit:0 -o not-match:"$pkt" cat ./out
+ pkt=$(make_pkt_str_arpreq 10.0.0.4 10.0.0.4)
+ atf_check -s exit:0 -o not-match:"$pkt" cat ./out
+ # DAD packets are sent instead.
+ pkt=$(make_pkt_str_arpreq 10.0.0.3 0.0.0.0)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+ pkt=$(make_pkt_str_arpreq 10.0.0.4 0.0.0.0)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+ fi
+
rump_server_destroy_ifaces
}
-arp_garp_body()
+test_garp()
{
test_garp_common false
}
-arp_garp_without_dad_body()
+test_garp_without_dad()
{
test_garp_common true
}
-arp_cache_overwriting_body()
+test_cache_overwriting()
{
rump_server_start $SOCKSRC
@@ -547,21 +510,21 @@ test_proxy_arp()
atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP4DST_PROXYARP2
}
-arp_proxy_arp_pub_body()
+test_proxy_arp_pub()
{
test_proxy_arp pub
rump_server_destroy_ifaces
}
-arp_proxy_arp_pubproxy_body()
+test_proxy_arp_pubproxy()
{
test_proxy_arp pubproxy
rump_server_destroy_ifaces
}
-arp_link_activation_body()
+test_link_activation()
{
rump_server_start $SOCKSRC
@@ -598,7 +561,7 @@ arp_link_activation_body()
rump_server_destroy_ifaces
}
-arp_static_body()
+test_static()
{
local macaddr_src=
@@ -623,70 +586,7 @@ arp_static_body()
rump_server_destroy_ifaces
}
-arp_cache_expiration_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-arp_command_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-arp_garp_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-arp_garp_without_dad_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-arp_cache_overwriting_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-arp_proxy_arp_pub_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-arp_proxy_arp_pubproxy_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-arp_link_activation_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-arp_static_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case arp_rtm cleanup
-arp_rtm_head()
-{
-
- atf_set "descr" "Tests for routing messages on operations of ARP entries"
- atf_set "require.progs" "rump_server"
-}
-
-arp_rtm_body()
+test_rtm()
{
local macaddr_src= macaddr_dst=
local file=./tmp
@@ -764,22 +664,7 @@ arp_rtm_body()
rump_server_destroy_ifaces
}
-arp_rtm_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case arp_purge_on_route_change cleanup
-arp_purge_on_route_change_head()
-{
-
- atf_set "descr" "Tests if ARP entries are removed on route change"
- atf_set "require.progs" "rump_server"
-}
-
-arp_purge_on_route_change_body()
+test_purge_on_route_change()
{
rump_server_start $SOCKSRC
@@ -806,22 +691,7 @@ arp_purge_on_route_change_body()
rump_server_destroy_ifaces
}
-arp_purge_on_route_change_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case arp_purge_on_route_delete cleanup
-arp_purge_on_route_delete_head()
-{
-
- atf_set "descr" "Tests if ARP entries are removed on route delete"
- atf_set "require.progs" "rump_server"
-}
-
-arp_purge_on_route_delete_body()
+test_purge_on_route_delete()
{
rump_server_start $SOCKSRC
@@ -844,22 +714,7 @@ arp_purge_on_route_delete_body()
rump_server_destroy_ifaces
}
-arp_purge_on_route_delete_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case arp_purge_on_ifdown cleanup
-arp_purge_on_ifdown_head()
-{
-
- atf_set "descr" "Tests if ARP entries are removed on interface down"
- atf_set "require.progs" "rump_server"
-}
-
-arp_purge_on_ifdown_body()
+test_purge_on_ifdown()
{
rump_server_start $SOCKSRC
@@ -882,22 +737,7 @@ arp_purge_on_ifdown_body()
rump_server_destroy_ifaces
}
-arp_purge_on_ifdown_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case arp_stray_entries cleanup
-arp_stray_entries_head()
-{
-
- atf_set "descr" "Tests if ARP entries are removed on route change"
- atf_set "require.progs" "rump_server"
-}
-
-arp_stray_entries_body()
+test_stray_entries()
{
rump_server_start $SOCKSRC
@@ -961,27 +801,150 @@ arp_stray_entries_body()
rump_server_destroy_ifaces
}
-arp_stray_entries_cleanup()
+test_cache_creation_common()
+{
+ local no_dad=$1
+
+ rump_server_start $SOCKSRC
+ rump_server_start $SOCKDST
+
+ if $no_dad; then
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o match:'3 -> 0' \
+ rump.sysctl -w net.inet.ip.dad_count=0
+ export RUMP_SERVER=$SOCKDST
+ atf_check -s exit:0 -o match:'3 -> 0' \
+ rump.sysctl -w net.inet.ip.dad_count=0
+ fi
+
+ setup_dst_server
+ setup_src_server
+
+ macaddr_src=$(get_macaddr $SOCKSRC shmif0)
+ macaddr_dst=$(get_macaddr $SOCKDST shmif0)
+
+ # ARP cache entries are not created for DAD/GARP packets.
+ export RUMP_SERVER=$SOCKSRC
+ atf_check -s exit:0 -o empty rump.arp -n -a
+ export RUMP_SERVER=$SOCKDST
+ atf_check -s exit:0 -o empty rump.arp -n -a
+
+ export RUMP_SERVER=$SOCKSRC
+
+ extract_new_packets bus1 > ./out
+
+ atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4DST
+ $DEBUG && rump.arp -n -a
+
+ extract_new_packets bus1 > ./out
+
+ atf_check -s exit:0 -o match:"\? \(10.0.1.2\) at $macaddr_dst on shmif0 [0-9]+s R" \
+ rump.arp -n -a
+
+ export RUMP_SERVER=$SOCKDST
+
+ # An entry was first created as stale then sending an ARP reply made it delay.
+ atf_check -s exit:0 -o match:"\? \(10.0.1.1\) at $macaddr_src on shmif0 [0-9]+s D" \
+ rump.arp -n -a
+
+ # The sender resolves the receiver's address.
+ pkt=$(make_pkt_str_arpreq 10.0.1.2 10.0.1.1)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+
+ # The receiver doesn't resolv the sender's address because the ARP request
+ # from the sender has let make an entry already.
+ pkt=$(make_pkt_str_arpreq 10.0.1.1 10.0.1.2)
+ atf_check -s exit:0 -o not-match:"$pkt" cat ./out
+
+ rump_server_destroy_ifaces
+}
+
+test_cache_creation()
+{
+
+ test_cache_creation_common false
+}
+
+test_cache_creation_nodad()
+{
+
+ test_cache_creation_common true
+}
+
+test_arp_request_count()
+{
+
+ export RUMP_SERVER=$SOCKSRC
+ pkt=$(make_pkt_str_arpreq 10.0.1.2 10.0.1.1)
+
+ extract_new_packets bus1 > ./out
+ atf_check -s not-exit:0 -o ignore -e ignore rump.ping -n -c 1 $IP4DST
+ extract_new_packets bus1 > ./out
+
+ # ARP sends request packets net.inet.arp.nd_bmaxtries times at most.
+ times=$(rump.sysctl -n net.inet.arp.nd_bmaxtries)
+ $DEBUG && echo times=$times
+ $DEBUG && cat ./out
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+ atf_check -s exit:0 -o match:"$times" sh -c "grep -E '$pkt' ./out |wc -l"
+}
+
+test_resolution()
+{
+
+ rump_server_start $SOCKSRC
+ setup_src_server
+
+ export RUMP_SERVER=$SOCKSRC
+
+ # Test default value of net.inet.arp.nd_bmaxtries
+ test_arp_request_count
+
+ # Test net.inet.arp.nd_bmaxtries=1
+ atf_check -s exit:0 rump.sysctl -wq net.inet.arp.nd_bmaxtries=1
+ test_arp_request_count
+
+ rump_server_destroy_ifaces
+}
+
+add_test()
{
+ local name=$1
+ local desc="$2"
- $DEBUG && dump
- cleanup
+ atf_test_case "arp_${name}" cleanup
+ eval "arp_${name}_head() {
+ atf_set descr \"${desc}\"
+ atf_set require.progs rump_server
+ }
+ arp_${name}_body() {
+ test_${name}
+ }
+ arp_${name}_cleanup() {
+ \$DEBUG && dump
+ cleanup
+ }"
+ atf_add_test_case "arp_${name}"
}
atf_init_test_cases()
{
- atf_add_test_case arp_cache_expiration
- atf_add_test_case arp_command
- atf_add_test_case arp_garp
- atf_add_test_case arp_garp_without_dad
- atf_add_test_case arp_cache_overwriting
- atf_add_test_case arp_proxy_arp_pub
- atf_add_test_case arp_proxy_arp_pubproxy
- atf_add_test_case arp_link_activation
- atf_add_test_case arp_static
- atf_add_test_case arp_rtm
- atf_add_test_case arp_purge_on_route_change
- atf_add_test_case arp_purge_on_route_delete
- atf_add_test_case arp_purge_on_ifdown
- atf_add_test_case arp_stray_entries
+
+ add_test cache_expiration "Tests for ARP cache expiration"
+ add_test command "Tests for arp_commands of arp(8)"
+ add_test garp "Tests for GARP"
+ add_test garp_without_dad "Tests for GARP with DAD disabled"
+ add_test cache_overwriting "Tests for behavior of overwriting ARP caches"
+ add_test proxy_arp_pub "Tests for Proxy ARP (pub)"
+ add_test proxy_arp_pubproxy "Tests for Proxy ARP (pub proxy)"
+ add_test link_activation "Tests for activating a new MAC address"
+ add_test static "Tests for static ARP entries"
+ add_test rtm "Tests for routing messages on operations of ARP entries"
+ add_test purge_on_route_change "Tests if ARP entries are removed on route change"
+ add_test purge_on_route_delete "Tests if ARP entries are removed on route delete"
+ add_test purge_on_ifdown "Tests if ARP entries are removed on interface down"
+ add_test stray_entries "Tests if ARP entries are removed on route change"
+ add_test cache_creation "Tests for ARP cache creation"
+ add_test cache_creation_nodad "Tests for ARP cache creation without DAD"
+ add_test resolution "Tests for ARP resolution"
}
diff --git a/net/arp/t_dad.sh b/net/arp/t_dad.sh
index 7adf016f7e40..a78f879274f5 100644
--- a/net/arp/t_dad.sh
+++ b/net/arp/t_dad.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_dad.sh,v 1.15 2017/03/11 02:01:10 ozaki-r Exp $
+# $NetBSD: t_dad.sh,v 1.16 2024/08/20 08:21:48 ozaki-r Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -32,6 +32,7 @@ DEBUG=${DEBUG:-false}
atf_test_case dad_basic cleanup
atf_test_case dad_duplicated cleanup
+atf_test_case dad_duplicated_nodad cleanup
dad_basic_head()
{
@@ -45,6 +46,12 @@ dad_duplicated_head()
atf_set "require.progs" "rump_server"
}
+dad_duplicated_nodad_head()
+{
+ atf_set "descr" "Tests for IPv4 DAD duplicated state w/o DAD"
+ atf_set "require.progs" "rump_server"
+}
+
setup_server()
{
local sock=$1
@@ -69,6 +76,16 @@ make_pkt_str()
echo $pkt
}
+make_reply_str()
+{
+ local srcmac=$1
+ local dstmac=$2
+ local ip=$3
+ pkt="$srcmac > $dstmac, ethertype ARP \(0x0806\), length 42:"
+ pkt="Reply $ip is-at $srcmac, length 28"
+ echo $pkt
+}
+
dad_basic_body()
{
local pkt=
@@ -190,6 +207,71 @@ dad_duplicated_body()
rump_server_destroy_ifaces
}
+dad_duplicated_nodad_body()
+{
+ local localip1=10.0.1.1
+ local localip2=10.0.1.11
+ local peerip=10.0.1.2
+ local lmac= pmac=
+
+ rump_server_start $SOCKLOCAL
+ rump_server_start $SOCKPEER
+
+ export RUMP_SERVER=$SOCKLOCAL
+ atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.dad_count=0
+ export RUMP_SERVER=$SOCKPEER
+ atf_check -s exit:0 -o ignore rump.sysctl -w net.inet.ip.dad_count=0
+
+ setup_server $SOCKLOCAL $localip1
+ setup_server $SOCKPEER $peerip
+
+ export RUMP_SERVER=$SOCKLOCAL
+
+ # The primary address isn't marked as duplicated
+ atf_check -s exit:0 -o not-match:"${localip1}.+DUPLICATED" \
+ rump.ifconfig shmif0
+
+ extract_new_packets bus1 > ./out
+
+ # GARP packets are sent
+ pkt=$(make_pkt_str $localip1 $localip1)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+ pkt=$(make_pkt_str $peerip $peerip)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+
+ # No DAD probe packets are sent
+ pkt=$(make_pkt_str $localip1 0.0.0.0)
+ atf_check -s exit:0 -o not-match:"$pkt" cat ./out
+ pkt=$(make_pkt_str $peerip 0.0.0.0)
+ atf_check -s exit:0 -o not-match:"$pkt" cat ./out
+
+ #
+ # Add a new address duplicated with the peer server
+ #
+ atf_check -s exit:0 rump.ifconfig shmif0 inet $peerip alias
+ atf_check -s exit:0 sleep 2
+
+ # The new address is NOT marked as duplicated
+ atf_check -s exit:0 -o not-match:"${peerip}.+DUPLICATED" \
+ rump.ifconfig shmif0
+
+ lmac=$(get_macaddr $SOCKLOCAL)
+ pmac=$(get_macaddr $SOCKPEER)
+ extract_new_packets bus1 > ./out
+
+ # The peer just replies a GARP of the peer
+ pkt=$(make_reply_str $pmac $lmac $peerip)
+ atf_check -s exit:0 -o match:"$pkt" cat ./out
+
+ # A unique address isn't marked as duplicated
+ atf_check -s exit:0 rump.ifconfig shmif0 inet $localip2 alias
+ atf_check -s exit:0 sleep 2
+ atf_check -s exit:0 -o not-match:"${localip2}.+DUPLICATED" \
+ rump.ifconfig shmif0
+
+ rump_server_destroy_ifaces
+}
+
dad_basic_cleanup()
{
$DEBUG && dump
@@ -202,8 +284,16 @@ dad_duplicated_cleanup()
cleanup
}
+dad_duplicated_nodad_cleanup()
+{
+
+ $DEBUG && dump
+ cleanup
+}
+
atf_init_test_cases()
{
atf_add_test_case dad_basic
atf_add_test_case dad_duplicated
+ atf_add_test_case dad_duplicated_nodad
}
diff --git a/net/bpf/Makefile b/net/bpf/Makefile
index ee278510ced7..b4b3bd5413fa 100644
--- a/net/bpf/Makefile
+++ b/net/bpf/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.6 2020/03/01 18:08:15 christos Exp $
+# $NetBSD: Makefile,v 1.7 2025/09/18 03:36:01 mrg Exp $
#
.include <bsd.own.mk>
@@ -13,4 +13,6 @@ LDADD+= -lrumpnet_shmif
LDADD+= -lrumpdev_bpf -lrumpdev -lrumpnet_netinet -lrumpnet_net
LDADD+= -lrumpnet ${LIBRUMPBASE}
+COPTS.t_bpf.c+= ${CC_WNO_CALLOC_TRANSPOSED_ARGS}
+
.include <bsd.test.mk>
diff --git a/net/can/Makefile b/net/can/Makefile
index 6c07b22f06f8..4ce15644b13c 100644
--- a/net/can/Makefile
+++ b/net/can/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.3 2020/03/01 18:08:16 christos Exp $
+# $NetBSD: Makefile,v 1.4 2024/12/11 19:57:13 andvar Exp $
#
.include <bsd.own.mk>
@@ -13,7 +13,7 @@ SRCS.t_canfilter= t_canfilter.c h_canutils.c
# XXX we don't use INET here, but we need rumpnet_netinet anyway:
# common code in if.c is compiled with -DINET and will dereference ip_pktq,
-# which is NULL if rumpnet_netinet is not inclued.
+# which is NULL if rumpnet_netinet is not included.
#
LDADD+= -lrumpnet_netcan -lrumpnet_netinet -lrumpnet_net -lrumpnet
LDADD+= ${LIBRUMPBASE}
diff --git a/net/carp/t_basic.sh b/net/carp/t_basic.sh
index b4962a1fc62d..f7145d2cac0f 100644
--- a/net/carp/t_basic.sh
+++ b/net/carp/t_basic.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_basic.sh,v 1.8 2019/08/19 03:22:05 ozaki-r Exp $
+# $NetBSD: t_basic.sh,v 1.9 2023/09/19 11:55:14 gson Exp $
#
# Copyright (c) 2017 Internet Initiative Japan Inc.
# All rights reserved.
@@ -328,9 +328,6 @@ add_test_case()
name="${name}_nocarpdevip"
desc="$desc without carpdev IP"
fi
- if [ $ipproto = ipv6 -a $carpdevip = no ]; then
- expected_failure_code="atf_expect_fail 'nd6 needs to be fixed';"
- fi
atf_test_case ${name} cleanup
eval "
diff --git a/net/if_bridge/Makefile b/net/if_bridge/Makefile
index 14540b178e93..7f4f2d46bfad 100644
--- a/net/if_bridge/Makefile
+++ b/net/if_bridge/Makefile
@@ -1,13 +1,16 @@
-# $NetBSD: Makefile,v 1.3 2017/03/11 04:24:52 ozaki-r Exp $
+# $NetBSD: Makefile,v 1.4 2024/09/03 08:01:38 ozaki-r Exp $
#
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/net/if_bridge
+FILESDIR= ${TESTSDIR}
.for name in bridge rtable
TESTS_SH+= t_${name}
TESTS_SH_SRC_t_${name}= ../net_common.sh t_${name}.sh
.endfor
+FILES+= broadcast.pcap.uue unicast.pcap.uue
+
.include <bsd.test.mk>
diff --git a/net/if_bridge/t_bridge.sh b/net/if_bridge/t_bridge.sh
index 0cc03370574a..e19f4aa3965b 100644
--- a/net/if_bridge/t_bridge.sh
+++ b/net/if_bridge/t_bridge.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_bridge.sh,v 1.19 2019/08/19 03:22:05 ozaki-r Exp $
+# $NetBSD: t_bridge.sh,v 1.21 2024/09/03 08:01:38 ozaki-r Exp $
#
# Copyright (c) 2014 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -40,43 +40,6 @@ IP6BR2=fc00::12
DEBUG=${DEBUG:-false}
TIMEOUT=5
-atf_test_case bridge_create_destroy cleanup
-atf_test_case bridge_ipv4 cleanup
-atf_test_case bridge_ipv6 cleanup
-atf_test_case bridge_member_ipv4 cleanup
-atf_test_case bridge_member_ipv6 cleanup
-
-bridge_create_destroy_head()
-{
-
- atf_set "descr" "Test creating/destroying bridge interfaces"
- atf_set "require.progs" "rump_server"
-}
-
-bridge_ipv4_head()
-{
- atf_set "descr" "Does simple if_bridge tests"
- atf_set "require.progs" "rump_server"
-}
-
-bridge_ipv6_head()
-{
- atf_set "descr" "Does simple if_bridge tests (IPv6)"
- atf_set "require.progs" "rump_server"
-}
-
-bridge_member_ipv4_head()
-{
- atf_set "descr" "Tests if_bridge with members with an IP address"
- atf_set "require.progs" "rump_server"
-}
-
-bridge_member_ipv6_head()
-{
- atf_set "descr" "Tests if_bridge with members with an IP address (IPv6)"
- atf_set "require.progs" "rump_server"
-}
-
setup_endpoint()
{
sock=${1}
@@ -320,7 +283,7 @@ test_ping6_member()
rump.ifconfig -v shmif0
}
-bridge_create_destroy_body()
+test_create_destroy()
{
rump_server_start $SOCK1 bridge
@@ -328,7 +291,7 @@ bridge_create_destroy_body()
test_create_destroy_common $SOCK1 bridge0
}
-bridge_ipv4_body()
+test_ipv4()
{
setup
test_setup
@@ -347,7 +310,7 @@ bridge_ipv4_body()
rump_server_destroy_ifaces
}
-bridge_ipv6_body()
+test_ipv6()
{
setup6
test_setup6
@@ -365,7 +328,7 @@ bridge_ipv6_body()
rump_server_destroy_ifaces
}
-bridge_member_ipv4_body()
+test_member_ipv4()
{
setup
test_setup
@@ -387,7 +350,7 @@ bridge_member_ipv4_body()
rump_server_destroy_ifaces
}
-bridge_member_ipv6_body()
+test_member_ipv6()
{
setup6
test_setup6
@@ -408,47 +371,166 @@ bridge_member_ipv6_body()
rump_server_destroy_ifaces
}
-bridge_create_destroy_cleanup()
+BUS_SHMIF0=./bus0
+BUS_SHMIF1=./bus1
+BUS_SHMIF2=./bus2
+
+unpack_file()
{
- $DEBUG && dump
- cleanup
+ atf_check -s exit:0 uudecode $(atf_get_srcdir)/${1}.uue
}
-bridge_ipv4_cleanup()
+reset_if_stats()
{
- $DEBUG && dump
- cleanup
+ for ifname in shmif0 shmif1 shmif2
+ do
+ atf_check -s exit:0 -o ignore rump.ifconfig -z $ifname
+ done
}
-bridge_ipv6_cleanup()
+test_protection()
{
- $DEBUG && dump
- cleanup
-}
+ unpack_file unicast.pcap
+ unpack_file broadcast.pcap
-bridge_member_ipv4_cleanup()
-{
+ rump_server_start $SOCK1 bridge
+ rump_server_add_iface $SOCK1 shmif0 $BUS_SHMIF0
+ rump_server_add_iface $SOCK1 shmif1 $BUS_SHMIF1
+ rump_server_add_iface $SOCK1 shmif2 $BUS_SHMIF2
+
+ export RUMP_SERVER=$SOCK1
+ atf_check -s exit:0 rump.ifconfig shmif0 up
+ atf_check -s exit:0 rump.ifconfig shmif1 up
+ atf_check -s exit:0 rump.ifconfig shmif2 up
+
+ atf_check -s exit:0 rump.ifconfig bridge0 create
+ atf_check -s exit:0 rump.ifconfig bridge0 up
+
+ atf_check -s exit:0 $HIJACKING brconfig bridge0 add shmif0 add shmif1 add shmif2
+ $DEBUG && rump.ifconfig
+
+ # Protected interfaces: -
+ # Learning: -
+ # Input: unicast through shmif0
+ # Output: shmif1, shmif2
+ reset_if_stats
+ atf_check -s exit:0 -o ignore shmif_pcapin unicast.pcap ${BUS_SHMIF0}
+ atf_check -s exit:0 -o match:"input: 1 packet" rump.ifconfig -v shmif0
+ atf_check -s exit:0 -o match:"output: 1 packet" rump.ifconfig -v shmif1
+ atf_check -s exit:0 -o match:"output: 1 packet" rump.ifconfig -v shmif2
+ $DEBUG && rump.ifconfig -v bridge0
- $DEBUG && dump
- cleanup
+ # Protected interfaces: -
+ # Learning: -
+ # Input: broadcast through shmif0
+ # Output: shmif1, shmif2
+ reset_if_stats
+ atf_check -s exit:0 -o ignore shmif_pcapin broadcast.pcap ${BUS_SHMIF0}
+ atf_check -s exit:0 -o match:"input: 1 packet" rump.ifconfig -v shmif0
+ atf_check -s exit:0 -o match:"output: 1 packet" rump.ifconfig -v shmif1
+ atf_check -s exit:0 -o match:"output: 1 packet" rump.ifconfig -v shmif2
+ $DEBUG && rump.ifconfig -v bridge0
+
+ # Protect shmif0 and shmif2
+ atf_check -s exit:0 $HIJACKING brconfig bridge0 protect shmif0
+ atf_check -s exit:0 $HIJACKING brconfig bridge0 protect shmif2
+ atf_check -s exit:0 \
+ -o match:"shmif0.+PROTECTED" \
+ -o match:"shmif2.+PROTECTED" \
+ -o not-match:"shmif1.+PROTECTED" \
+ $HIJACKING brconfig bridge0
+
+ # Protected interfaces: shmif0 shmif2
+ # Learning: -
+ # Input: unicast through shmif0
+ # Output: shmif1
+ reset_if_stats
+ atf_check -s exit:0 -o ignore shmif_pcapin unicast.pcap ${BUS_SHMIF0}
+ atf_check -s exit:0 -o match:"input: 1 packet" rump.ifconfig -v shmif0
+ atf_check -s exit:0 -o match:"output: 1 packet" rump.ifconfig -v shmif1
+ atf_check -s exit:0 -o match:"output: 0 packet" rump.ifconfig -v shmif2
+ $DEBUG && rump.ifconfig -v bridge0
+
+ # Protected interfaces: shmif0 shmif2
+ # Learning: -
+ # Input: broadcast through shmif0
+ # Output: shmif1
+ reset_if_stats
+ atf_check -s exit:0 -o ignore shmif_pcapin broadcast.pcap ${BUS_SHMIF0}
+ atf_check -s exit:0 -o match:"input: 1 packet" rump.ifconfig -v shmif0
+ atf_check -s exit:0 -o match:"output: 1 packet" rump.ifconfig -v shmif1
+ atf_check -s exit:0 -o match:"output: 0 packet" rump.ifconfig -v shmif2
+ $DEBUG && rump.ifconfig -v bridge0
+
+ # Insert a route 00:aa:aa:aa:aa:aa shmif2 to test forwarding path of known-unicast-frame
+ atf_check -s exit:0 $HIJACKING brconfig bridge0 static shmif2 00:aa:aa:aa:aa:aa
+ atf_check -s exit:0 -o match:'00:aa:aa:aa:aa:aa shmif2 0 flags=1<STATIC>' \
+ $HIJACKING brconfig bridge0
+ $DEBUG && $HIJACKING brconfig bridge0
+
+ # Protected interfaces: shmif0 shmif2
+ # Learning: 00:aa:aa:aa:aa:aa shmif2
+ # Input: broadcast through shmif0
+ # Output: -
+ reset_if_stats
+ atf_check -s exit:0 -o ignore shmif_pcapin unicast.pcap ${BUS_SHMIF0}
+ atf_check -s exit:0 -o match:"input: 1 packet" rump.ifconfig -v shmif0
+ atf_check -s exit:0 -o match:"output: 0 packet" rump.ifconfig -v shmif1
+ atf_check -s exit:0 -o match:"output: 0 packet" rump.ifconfig -v shmif2
+ $DEBUG && rump.ifconfig -v bridge0
+
+ # Unprotect shmif2
+ atf_check -s exit:0 $HIJACKING brconfig bridge0 -protect shmif2
+ atf_check -s exit:0 \
+ -o match:"shmif0.+PROTECTED" \
+ -o not-match:"shmif2.+PROTECTED" \
+ -o not-match:"shmif1.+PROTECTED" \
+ $HIJACKING brconfig bridge0
+
+ # Protected interfaces: shmif0
+ # Learning: 00:aa:aa:aa:aa:aa shmif2
+ # Input: broadcast through shmif0
+ # Output: shmif2
+ reset_if_stats
+ atf_check -s exit:0 -o ignore shmif_pcapin unicast.pcap ${BUS_SHMIF0}
+ atf_check -s exit:0 -o match:"input: 1 packet" rump.ifconfig -v shmif0
+ atf_check -s exit:0 -o match:"output: 0 packet" rump.ifconfig -v shmif1
+ atf_check -s exit:0 -o match:"output: 1 packet" rump.ifconfig -v shmif2
+ $DEBUG && rump.ifconfig -v bridge0
+
+ rump_server_destroy_ifaces
}
-bridge_member_ipv6_cleanup()
+add_test()
{
+ local name=$1
+ local desc="$2"
- $DEBUG && dump
- cleanup
+ atf_test_case "bridge_${name}" cleanup
+ eval "bridge_${name}_head() {
+ atf_set descr \"${desc}\"
+ atf_set require.progs rump_server
+ }
+ bridge_${name}_body() {
+ test_${name}
+ }
+ bridge_${name}_cleanup() {
+ \$DEBUG && dump
+ cleanup
+ }"
+ atf_add_test_case "bridge_${name}"
}
atf_init_test_cases()
{
- atf_add_test_case bridge_create_destroy
- atf_add_test_case bridge_ipv4
- atf_add_test_case bridge_ipv6
- atf_add_test_case bridge_member_ipv4
- atf_add_test_case bridge_member_ipv6
+ add_test create_destroy "Tests creating/destroying bridge interfaces"
+ add_test ipv4 "Does basic if_bridge tests (IPv4)"
+ add_test ipv6 "Does basic if_bridge tests (IPv6)"
+ add_test member_ipv4 "Tests if_bridge with members with an IP address (IPv4)"
+ add_test member_ipv6 "Tests if_bridge with members with an IP address (IPv6)"
+ add_test protection "Tests interface protection"
}
diff --git a/net/if_ipsec/t_ipsec_unnumbered.sh b/net/if_ipsec/t_ipsec_unnumbered.sh
index 9299ae66e895..702cc8a578b4 100644
--- a/net/if_ipsec/t_ipsec_unnumbered.sh
+++ b/net/if_ipsec/t_ipsec_unnumbered.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ipsec_unnumbered.sh,v 1.1 2022/11/25 08:43:16 knakahara Exp $
+# $NetBSD: t_ipsec_unnumbered.sh,v 1.2 2023/09/27 08:48:01 knakahara Exp $
#
# Copyright (c) 2022 Internet Initiative Japan Inc.
# All rights reserved.
@@ -73,7 +73,7 @@ add_sa()
local tmpfile=./tmp
local spi=10000
local algo_args="$(generate_algo_args esp $algo)"
- local uniq=8200 # 8192(reqid_base) + 2 * 4(lo0, shmif0, shmif1 and ipsec0)
+ local uniq=8192 # 8192(reqid_base) + 2 * 0(unit id of "ipsec0")
export RUMP_SERVER=$SOCK_LOCAL
cat > $tmpfile <<-EOF
diff --git a/net/if_lagg/t_lagg.sh b/net/if_lagg/t_lagg.sh
index dfcab31172db..7b6f0f266cc2 100644
--- a/net/if_lagg/t_lagg.sh
+++ b/net/if_lagg/t_lagg.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_lagg.sh,v 1.8 2022/03/31 03:26:33 yamaguchi Exp $
+# $NetBSD: t_lagg.sh,v 1.11 2024/04/05 07:04:17 yamaguchi Exp $
#
# Copyright (c) 2021 Internet Initiative Japan Inc.
# All rights reserved.
@@ -214,7 +214,7 @@ lagg_ifconfig_body()
lagg_ifconfig_cleanup()
{
- $DEBG && dump
+ $DEBUG && dump
cleanup
}
@@ -367,6 +367,7 @@ lagg_mtu_head()
lagg_mtu_body()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
+ local mtu_lagg=1500
local mtu_1st=1450
local mtu_big=1460
local mtu_small=1440
@@ -379,59 +380,47 @@ lagg_mtu_body()
rump_server_add_iface $SOCK_HOST0 shmif2 $BUS2
$atf_ifconfig lagg0 create
$atf_ifconfig lagg0 laggproto lacp
+ $atf_ifconfig lagg0 up
$atf_ifconfig shmif0 mtu $mtu_1st
$atf_ifconfig shmif1 mtu $mtu_big
$atf_ifconfig shmif2 mtu $mtu_small
- atf_check -s exit:0 -o match:"mtu *1500" rump.ifconfig lagg0
+ # check initial MTU settings
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig lagg0
atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif0
atf_check -s exit:0 -o match:"mtu *$mtu_big" rump.ifconfig shmif1
atf_check -s exit:0 -o match:"mtu *$mtu_small" rump.ifconfig shmif2
- # copy MTU from 1st port
+ # copy MTU to 1st added port
$atf_ifconfig lagg0 laggport shmif0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig lagg0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif0
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig lagg0
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig shmif0
# copy MTU to added port
$atf_ifconfig lagg0 laggport shmif1
$atf_ifconfig lagg0 laggport shmif2
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig lagg0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif1
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif2
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig lagg0
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig shmif0
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig shmif1
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig shmif2
# reset MTU after detaching from lagg0
$atf_ifconfig lagg0 -laggport shmif2
atf_check -s exit:0 -o match:"mtu *$mtu_small" rump.ifconfig shmif2
# change MTU of lagg0
- $atf_ifconfig lagg0 mtu 1500
- atf_check -s exit:0 -o match:"mtu *1500" rump.ifconfig lagg0
- atf_check -s exit:0 -o match:"mtu *1500" rump.ifconfig shmif0
- atf_check -s exit:0 -o match:"mtu *1500" rump.ifconfig shmif1
+ mtu_lagg=1400
+ $atf_ifconfig lagg0 mtu $mtu_lagg
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig lagg0
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig shmif0
+ atf_check -s exit:0 -o match:"mtu *$mtu_lagg" rump.ifconfig shmif1
# reset MTU after detching from lagg0
$atf_ifconfig lagg0 -laggport shmif0
$atf_ifconfig lagg0 -laggport shmif1
atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif0
atf_check -s exit:0 -o match:"mtu *$mtu_big" rump.ifconfig shmif1
-
- # MTU should not be changed
- atf_check -s exit:0 -o match:"mtu *1500" rump.ifconfig lagg0
-
- # copy MTU from 1st port even when MTU of lagg0 is changhed
- $atf_ifconfig lagg0 mtu 1400
- atf_check -s exit:0 -o match:"mtu *1400" rump.ifconfig lagg0
- $atf_ifconfig lagg0 laggport shmif0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig lagg0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif0
-
- # MTU of lagg0 need not reset
- $atf_ifconfig lagg0 -laggport shmif0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig lagg0
- atf_check -s exit:0 -o match:"mtu *$mtu_1st" rump.ifconfig shmif0
}
lagg_mtu_cleanup()
diff --git a/net/if_tap/t_tap.sh b/net/if_tap/t_tap.sh
index 1b60731d9037..62e20d4507ca 100644
--- a/net/if_tap/t_tap.sh
+++ b/net/if_tap/t_tap.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_tap.sh,v 1.11 2020/09/30 14:43:15 roy Exp $
+# $NetBSD: t_tap.sh,v 1.12 2024/08/07 09:48:18 rin Exp $
#
# Copyright (c) 2016 Internet Initiative Japan Inc.
# All rights reserved.
@@ -179,7 +179,7 @@ tap_bridged_body()
atf_check -s exit:0 rump.ifconfig -w 10
# Now we can ping the tap address
- export RUMP_SERVER=${SOCK_LOCAL}
+ export RUMP_SERVER=${SOCK_REMOTE}
atf_check -s exit:0 -o ignore rump.ping -n -w $TIMEOUT -c 1 $IP4_TAP
atf_check -s exit:0 -o ignore rump.ping6 -n -X $TIMEOUT -c 1 $IP6_TAP
diff --git a/net/if_vlan/t_vlan.sh b/net/if_vlan/t_vlan.sh
index dc202018fff1..3ee9bc1a4e05 100644
--- a/net/if_vlan/t_vlan.sh
+++ b/net/if_vlan/t_vlan.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_vlan.sh,v 1.24 2021/08/19 03:27:05 yamaguchi Exp $
+# $NetBSD: t_vlan.sh,v 1.27 2025/03/18 07:58:09 ozaki-r Exp $
#
# Copyright (c) 2016 Internet Initiative Japan Inc.
# All rights reserved.
@@ -87,38 +87,14 @@ vlan_create_destroy_body_common()
}
-atf_test_case vlan_create_destroy cleanup
-vlan_create_destroy_head()
-{
-
- atf_set "descr" "tests of creation and deletion of vlan interface"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_create_destroy_body()
+test_create_destroy()
{
rump_server_start $SOCK_LOCAL vlan
vlan_create_destroy_body_common
}
-
-vlan_create_destroy_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_create_destroy6 cleanup
-vlan_create_destroy6_head()
-{
-
- atf_set "descr" "tests of creation and deletion of vlan interface with IPv6"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_create_destroy6_body()
+test_create_destroy6()
{
rump_server_start $SOCK_LOCAL vlan netinet6
@@ -126,13 +102,6 @@ vlan_create_destroy6_body()
vlan_create_destroy_body_common
}
-vlan_create_destroy6_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
vlan_basic_body_common()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
@@ -208,15 +177,7 @@ vlan_basic_body_common()
atf_check -s exit:0 -o not-match:' 0 bytes' cat $outfile
}
-atf_test_case vlan_basic cleanup
-vlan_basic_head()
-{
-
- atf_set "descr" "tests of communications over vlan interfaces"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_basic_body()
+test_basic()
{
rump_server_start $SOCK_LOCAL vlan
rump_server_start $SOCK_REMOTE vlan
@@ -225,22 +186,7 @@ vlan_basic_body()
}
-vlan_basic_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_basic6 cleanup
-vlan_basic6_head()
-{
-
- atf_set "descr" "tests of communications over vlan interfaces using IPv6"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_basic6_body()
+test_basic6()
{
rump_server_start $SOCK_LOCAL vlan netinet6
rump_server_start $SOCK_REMOTE vlan netinet6
@@ -248,13 +194,6 @@ vlan_basic6_body()
vlan_basic_body_common inet6
}
-vlan_basic6_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
vlan_auto_follow_mtu_body_common()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
@@ -336,15 +275,7 @@ vlan_auto_follow_mtu_body_common()
fi
}
-atf_test_case vlan_auto_follow_mtu cleanup
-vlan_auto_follow_mtu_head()
-{
-
- atf_set "descr" "tests of setting vlan mtu using IPv4"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_auto_follow_mtu_body()
+test_auto_follow_mtu()
{
rump_server_start $SOCK_LOCAL vlan
rump_server_start $SOCK_REMOTE vlan
@@ -352,22 +283,7 @@ vlan_auto_follow_mtu_body()
vlan_auto_follow_mtu_body_common inet
}
-vlan_auto_follow_mtu_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_auto_follow_mtu6 cleanup
-vlan_auto_follow_mtu6_head()
-{
-
- atf_set "descr" "tests of setting vlan mtu using IPv6"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_auto_follow_mtu6_body()
+test_auto_follow_mtu6()
{
rump_server_start $SOCK_LOCAL vlan netinet6
rump_server_start $SOCK_REMOTE vlan netinet6
@@ -375,13 +291,6 @@ vlan_auto_follow_mtu6_body()
vlan_auto_follow_mtu_body_common inet6
}
-vlan_auto_follow_mtu6_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
vlanid_config_and_ping()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
@@ -529,15 +438,7 @@ vlan_vlanid_body_common()
atf_check -s exit:0 -o ignore $ping_cmd $remote1
}
-atf_test_case vlan_vlanid cleanup
-vlan_vlanid_head()
-{
-
- atf_set "descr" "tests of configuration for vlan id"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_vlanid_body()
+test_vlanid()
{
rump_server_start $SOCK_LOCAL vlan
rump_server_start $SOCK_REMOTE vlan
@@ -545,23 +446,7 @@ vlan_vlanid_body()
vlan_vlanid_body_common inet
}
-vlan_vlanid_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_vlanid6 cleanup
-vlan_vlanid6_head()
-{
-
- atf_set "descr" "tests of configuration for vlan id using IPv6"
- atf_set "require.progs" "rump_server"
-}
-
-
-vlan_vlanid6_body()
+test_vlanid6()
{
rump_server_start $SOCK_LOCAL vlan netinet6
rump_server_start $SOCK_REMOTE vlan netinet6
@@ -569,13 +454,6 @@ vlan_vlanid6_body()
vlan_vlanid_body_common inet6
}
-vlan_vlanid6_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
vlan_configs_body_common()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
@@ -627,14 +505,7 @@ vlan_configs_body_common()
$atf_ifconfig vlan0 vlan 10 vlanif shmif0
}
-atf_test_case vlan_configs cleanup
-vlan_configs_head()
-{
- atf_set "descr" "tests of configuration except vlan id"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_configs_body()
+test_configs()
{
rump_server_start $SOCK_LOCAL vlan
@@ -643,33 +514,13 @@ vlan_configs_body()
}
-vlan_configs_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_configs6 cleanup
-vlan_configs6_head()
-{
- atf_set "descr" "tests of configuration except vlan id using IPv6"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_configs6_body()
+test_configs6()
{
rump_server_start $SOCK_LOCAL vlan netinet6
vlan_configs_body_common
}
-vlan_configs6_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
vlan_bridge_body_common()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
@@ -752,50 +603,20 @@ vlan_bridge_body_common()
rump_server_destroy_ifaces
}
-atf_test_case vlan_bridge cleanup
-vlan_bridge_head()
-{
-
- atf_set "descr" "tests of vlan interfaces with bridges (IPv4)"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_bridge_body()
+test_bridge()
{
rump_server_start $SOCK_LOCAL vlan bridge
vlan_bridge_body_common
}
-vlan_bridge_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_bridge6 cleanup
-vlan_bridge6_head()
-{
-
- atf_set "descr" "tests of vlan interfaces with bridges (IPv6)"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_bridge6_body()
+test_bridge6()
{
rump_server_start $SOCK_LOCAL vlan netinet6 bridge
vlan_bridge_body_common
}
-vlan_bridge6_cleanup()
-{
-
- $DEBUG && dump
- cleanup
-}
-
vlan_multicast_body_common()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
@@ -875,55 +696,21 @@ vlan_multicast_body_common()
atf_check -s exit:0 -o not-match:"$eth_mcaddr" $HIJACKING ifmcstat
}
-atf_test_case vlan_multicast cleanup
-vlan_multicast_head()
-{
- atf_set "descr" "tests of multicast address adding and deleting"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_multicast_body()
+test_multicast()
{
rump_server_start $SOCK_LOCAL vlan
vlan_multicast_body_common inet
}
-vlan_multicast_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_multicast6 cleanup
-vlan_multicast6_head()
-{
- atf_set "descr" "tests of multicast address adding and deleting with IPv6"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_multicast6_body()
+test_multicast6()
{
rump_server_start $SOCK_LOCAL vlan netinet6
vlan_multicast_body_common inet6
}
-vlan_multicast6_cleanup()
-{
- $DEBUG && dump
- cleanup
-}
-
-atf_test_case vlan_promisc cleanup
-vlan_promisc_head()
-{
-
- atf_set "descr" "tests of IFF_PROMISC of vlan"
- atf_set "require.progs" "rump_server"
-}
-
-vlan_promisc_body()
+test_promisc()
{
local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
local atf_brconfig="atf_check -s exit:0 $HIJACKING /sbin/brconfig"
@@ -1028,30 +815,237 @@ vlan_promisc_body()
atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
}
-vlan_promisc_cleanup()
+vlan_l2tp_body_common()
{
+ local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
+
+ local af=$1
+ local ping_cmd="rump.ping -c 1"
+ local pfx=24
+ local local0=$IP_LOCAL0
+ local local1=$IP_LOCAL1
+ local remote0=$IP_REMOTE0
+ local remote1=$IP_REMOTE1
+ local sysctl_param="net.inet.ip.dad_count=0"
+ local vid0=10
+ local vid1=11
+
+ local l2tp_laddr=10.222.222.1
+ local l2tp_lsession=1001
+ local l2tp_raddr=10.222.222.2
+ local l2tp_rsession=1002
+
+ if [ x"$af" = x"inet6" ]; then
+ ping_cmd="rump.ping6 -c 1"
+ rumplib="netinet6"
+ pfx=64
+ local0=$IP6_LOCAL0
+ local1=$IP6_LOCAL1
+ remote0=$IP6_REMOTE0
+ remote1=$IP6_REMOTE1
+ sysctl_param="net.inet6.ip6.dad_count=0"
+ fi
+
+ rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
+ rump_server_add_iface $SOCK_LOCAL l2tp0
+ rump_server_add_iface $SOCK_LOCAL vlan0
+ rump_server_add_iface $SOCK_LOCAL vlan1
+
+ rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
+ rump_server_add_iface $SOCK_REMOTE l2tp0
+ rump_server_add_iface $SOCK_REMOTE vlan0
+ rump_server_add_iface $SOCK_REMOTE vlan1
+
+ export RUMP_SERVER=$SOCK_LOCAL
+ atf_check -s exit:0 -o ignore rump.sysctl -w $sysctl_param
+ $atf_ifconfig shmif0 $l2tp_laddr/24
+ $atf_ifconfig l2tp0 tunnel $l2tp_laddr $l2tp_raddr
+ $atf_ifconfig l2tp0 session $l2tp_lsession $l2tp_rsession
+ $atf_ifconfig l2tp0 up
+
+ export RUMP_SERVER=$SOCK_REMOTE
+ atf_check -s exit:0 -o ignore rump.sysctl -w $sysctl_param
+ $atf_ifconfig shmif0 $l2tp_raddr/24
+ $atf_ifconfig l2tp0 tunnel $l2tp_raddr $l2tp_laddr
+ $atf_ifconfig l2tp0 session $l2tp_rsession $l2tp_lsession
+ $atf_ifconfig l2tp0 up
+
+ # configure vlans on l2tp(4)
+ export RUMP_SERVER=$SOCK_LOCAL
+ $atf_ifconfig vlan0 vlan $vid0 vlanif l2tp0
+ $atf_ifconfig vlan0 $af $local0/$pfx
+ $atf_ifconfig vlan1 vlan $vid1 vlanif l2tp0
+ $atf_ifconfig vlan1 $af $local1/$pfx
+ export RUMP_SERVER=$SOCK_REMOTE
+ $atf_ifconfig vlan0 vlan $vid0 vlanif l2tp0
+ $atf_ifconfig vlan0 $af $remote0/$pfx
+ $atf_ifconfig vlan1 vlan $vid1 vlanif l2tp0
+ $atf_ifconfig vlan1 $af $remote1/$pfx
- $DEBUG && dump
- cleanup
+ # test for VLAN frame transfer
+ export RUMP_SERVER=$SOCK_LOCAL
+ atf_check -s exit:0 -o ignore $ping_cmd $remote0
+ atf_check -s exit:0 -o ignore $ping_cmd $remote1
+
+ # unconfig vlans
+ export RUMP_SERVER=$SOCK_LOCAL
+ $atf_ifconfig vlan0 -vlanif
+ export RUMP_SERVER=$SOCK_REMOTE
+ $atf_ifconfig vlan0 -vlanif
+
+ # remove l2tp0 that has vlan1
+ export RUMP_SERVER=$SOCK_LOCAL
+ $atf_ifconfig l2tp0 destroy
+ export RUMP_SERVER=$SOCK_REMOTE
+ $atf_ifconfig l2tp0 destroy
+}
+
+test_l2tp()
+{
+
+ rump_server_start $SOCK_LOCAL vlan l2tp
+ rump_server_start $SOCK_REMOTE vlan l2tp
+
+ vlan_l2tp_body_common "inet"
+}
+
+test_l2tp6()
+{
+
+ rump_server_start $SOCK_LOCAL vlan l2tp netinet6
+ rump_server_start $SOCK_REMOTE vlan l2tp netinet6
+
+ vlan_l2tp_body_common "inet6"
+}
+
+check_link_state()
+{
+ local ifname=$1
+ local state=$2
+
+ atf_check -s exit:0 -o match:"linkstate: $state" $HIJACKING rump.ifconfig -v $ifname
+}
+
+create_interfaces()
+{
+
+ atf_check -s exit:0 rump.ifconfig vlan0 create
+ atf_check -s exit:0 rump.ifconfig shmif0 create
+}
+
+destroy_interfaces()
+{
+
+ atf_check -s exit:0 rump.ifconfig vlan0 destroy
+ atf_check -s exit:0 rump.ifconfig shmif0 destroy
+}
+
+test_link_state_sync()
+{
+ local ifconfig="atf_check -s exit:0 rump.ifconfig"
+
+ rump_server_start $SOCK_LOCAL vlan
+
+ export RUMP_SERVER=${SOCK_LOCAL}
+
+ ## Alone
+ $ifconfig vlan0 create
+ # The default state is "down"
+ check_link_state vlan0 down
+ $ifconfig vlan0 up
+ check_link_state vlan0 down
+ $ifconfig vlan0 down
+ check_link_state vlan0 down
+ $ifconfig vlan0 destroy
+
+ ## "unknown" parent
+ create_interfaces
+ # shmif0 is "unknown" until ifconfig linkstr
+ check_link_state shmif0 unknown
+ $ifconfig vlan0 vlan 1 vlanif shmif0
+ # vlan0 syncs with the parent
+ check_link_state vlan0 unknown
+ $ifconfig vlan0 up
+ check_link_state vlan0 unknown
+ $ifconfig vlan0 -vlanif
+ # Back to the default
+ check_link_state vlan0 down
+ destroy_interfaces
+
+ ## "up" parent
+ create_interfaces
+ $ifconfig shmif0 linkstr $BUS
+ check_link_state shmif0 up
+ $ifconfig vlan0 vlan 1 vlanif shmif0
+ # vlan0 syncs with the parent
+ check_link_state vlan0 up
+ $ifconfig vlan0 -vlanif
+ # Back to the default
+ check_link_state vlan0 down
+ destroy_interfaces
+
+ ## Change parent's link state to "up", "down", then "up"
+ create_interfaces
+ $ifconfig shmif0 linkstr $BUS
+ check_link_state shmif0 up
+ $ifconfig vlan0 vlan 1 vlanif shmif0
+ check_link_state vlan0 up
+ # Down the parent
+ $ifconfig shmif0 media none
+ check_link_state shmif0 down
+ # vlan0 syncs with the parent
+ check_link_state vlan0 down
+ # Up the parent again
+ $ifconfig shmif0 media auto
+ # vlan0 syncs with the parent
+ check_link_state vlan0 up
+ $ifconfig vlan0 -vlanif
+ # Back to the default
+ check_link_state vlan0 down
+ destroy_interfaces
+}
+
+add_test()
+{
+ local name=$1
+ local desc="$2"
+
+ atf_test_case "vlan_${name}" cleanup
+ eval "vlan_${name}_head() {
+ atf_set descr \"${desc}\"
+ atf_set require.progs rump_server
+ }
+ vlan_${name}_body() {
+ test_${name}
+ }
+ vlan_${name}_cleanup() {
+ \$DEBUG && dump
+ cleanup
+ }"
+ atf_add_test_case "vlan_${name}"
}
atf_init_test_cases()
{
- atf_add_test_case vlan_create_destroy
- atf_add_test_case vlan_basic
- atf_add_test_case vlan_auto_follow_mtu
- atf_add_test_case vlan_vlanid
- atf_add_test_case vlan_configs
- atf_add_test_case vlan_bridge
- atf_add_test_case vlan_multicast
- atf_add_test_case vlan_promisc
+ add_test create_destroy "tests of creation and deletion of vlan interface"
+ add_test basic "tests of communications over vlan interfaces"
+ add_test auto_follow_mtu "tests of setting vlan mtu using IPv4"
+ add_test vlanid "tests of configuration for vlan id"
+ add_test configs "tests of configuration except vlan id"
+ add_test bridge "tests of vlan interfaces with bridges (IPv4)"
+ add_test multicast "tests of multicast address adding and deleting"
+ add_test l2tp "tests of vlan(IPv4) over l2tp(IPv4)"
+
+ add_test create_destroy6 "tests of creation and deletion of vlan interface with IPv6"
+ add_test basic6 "tests of communications over vlan interfaces using IPv6"
+ add_test auto_follow_mtu6 "tests of setting vlan mtu using IPv6"
+ add_test vlanid6 "tests of configuration for vlan id using IPv6"
+ add_test configs6 "tests of configuration except vlan id using IPv6"
+ add_test bridge6 "tests of vlan interfaces with bridges (IPv6)"
+ add_test multicast6 "tests of multicast address adding and deleting with IPv6"
+ add_test l2tp6 "tests of vlan(IPv6) over l2tp(IPv4)"
- atf_add_test_case vlan_create_destroy6
- atf_add_test_case vlan_basic6
- atf_add_test_case vlan_auto_follow_mtu6
- atf_add_test_case vlan_vlanid6
- atf_add_test_case vlan_configs6
- atf_add_test_case vlan_bridge6
- atf_add_test_case vlan_multicast6
+ add_test promisc "tests of IFF_PROMISC of vlan"
+ add_test link_state_sync "tests of link state sync with its parent"
}
diff --git a/net/if_wg/t_basic.sh b/net/if_wg/t_basic.sh
index ae4b6610b8ff..1cc9f983c51e 100644
--- a/net/if_wg/t_basic.sh
+++ b/net/if_wg/t_basic.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_basic.sh,v 1.4 2021/03/02 07:16:24 simonb Exp $
+# $NetBSD: t_basic.sh,v 1.6 2024/10/08 02:29:40 riastradh Exp $
#
# Copyright (c) 2018 Ryota Ozaki <ozaki.ryota@gmail.com>
# All rights reserved.
@@ -48,6 +48,21 @@ check_ping_payload()
done
}
+check_badudp()
+{
+ local proto=$1
+ local ip=$2
+ local port=51820 # XXX parametrize more clearly
+
+ if [ $proto = inet ]; then
+ atf_check -o ignore -e ignore \
+ $HIJACKING nc -4uv -w1 $ip $port </dev/null
+ else
+ atf_check -o ignore -e ignore \
+ $HIJACKING nc -6uv -w1 $ip $port </dev/null
+ fi
+}
+
test_common()
{
local type=$1
@@ -107,6 +122,9 @@ test_common()
elif [ $type = payload ]; then
export RUMP_SERVER=$SOCK_LOCAL
check_ping_payload $inner_proto $ip_wg_peer
+ elif [ $type = badudp ]; then
+ export RUMP_SERVER=$SOCK_LOCAL
+ check_badudp $outer_proto $ip_peer
fi
destroy_wg_interfaces
@@ -282,6 +300,36 @@ add_payload_sizes_test()
atf_add_test_case ${name}
}
+add_badudp_test()
+{
+ local inner=$1
+ local outer=$2
+ local ipv4=inet
+ local ipv6=inet6
+
+ name="wg_badudp_${inner}_over_${outer}"
+ fulldesc="Test wg(4) with ${inner} over ${outer} with bad UDP packets"
+
+ eval inner=\$$inner
+ eval outer=\$$outer
+
+ atf_test_case ${name} cleanup
+ eval "
+ ${name}_head() {
+ atf_set descr \"${fulldesc}\"
+ atf_set require.progs rump_server wgconfig wg-keygen nc
+ }
+ ${name}_body() {
+ test_common badudp $outer $inner
+ rump_server_destroy_ifaces
+ }
+ ${name}_cleanup() {
+ \$DEBUG && dump
+ cleanup
+ }"
+ atf_add_test_case ${name}
+}
+
atf_test_case wg_multiple_interfaces cleanup
wg_multiple_interfaces_head()
{
@@ -459,6 +507,11 @@ wg_multiple_peers_cleanup()
atf_init_test_cases()
{
+ add_badudp_test ipv4 ipv4
+ add_badudp_test ipv4 ipv6
+ add_badudp_test ipv6 ipv4
+ add_badudp_test ipv6 ipv6
+
add_basic_test ipv4 ipv4
add_basic_test ipv4 ipv6
add_basic_test ipv6 ipv4
diff --git a/net/if_wg/t_misc.sh b/net/if_wg/t_misc.sh
index 8063e858dd8a..fcc8d8520925 100644
--- a/net/if_wg/t_misc.sh
+++ b/net/if_wg/t_misc.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_misc.sh,v 1.12 2022/06/13 07:59:15 martin Exp $
+# $NetBSD: t_misc.sh,v 1.16 2024/08/26 17:52:46 riastradh Exp $
#
# Copyright (c) 2018 Ryota Ozaki <ozaki.ryota@gmail.com>
# All rights reserved.
@@ -55,9 +55,13 @@ wg_rekey_body()
export RUMP_SERVER=$SOCK_LOCAL
atf_check -s exit:0 -o ignore \
rump.sysctl -w net.wg.rekey_after_time=$rekey_after_time
+ $DEBUG && atf_check -s exit:0 -o ignore \
+ rump.sysctl -w net.wg.debug=-1
export RUMP_SERVER=$SOCK_PEER
atf_check -s exit:0 -o ignore \
rump.sysctl -w net.wg.rekey_after_time=$rekey_after_time
+ $DEBUG && atf_check -s exit:0 -o ignore \
+ rump.sysctl -w net.wg.debug=-1
# It sets key_priv_local key_pub_local key_priv_peer key_pub_peer
generate_keys
@@ -76,18 +80,18 @@ wg_rekey_body()
export RUMP_SERVER=$SOCK_LOCAL
+ echo ping1time=$(date)
$ping $ip_wg_peer
latest_handshake=$($HIJACKING wgconfig wg0 show peer peer0 \
| awk -F ': ' '/latest-handshake/ {print $2;}')
- $DEBUG && echo $latest_handshake
+ $DEBUG && echo handshake1=$latest_handshake
sleep 1
+ echo ping2time=$(date)
$ping $ip_wg_peer
- atf_expect_fail "PR kern/56252"
-
# No reinitiation is performed
atf_check -s exit:0 -o match:"$latest_handshake" \
$HIJACKING wgconfig wg0 show peer peer0
@@ -95,6 +99,7 @@ wg_rekey_body()
# Wait for a reinitiation to be performed
sleep $rekey_after_time
+ echo ping3time=$(date)
$ping $ip_wg_peer
# A reinitiation should be performed
@@ -103,11 +108,12 @@ wg_rekey_body()
latest_handshake=$($HIJACKING wgconfig wg0 show peer peer0 \
| awk -F ': ' '/latest-handshake/ {print $2;}')
- $DEBUG && echo $latest_handshake
+ $DEBUG && echo handshake2=$latest_handshake
# Wait for a reinitiation to be performed again
sleep $((rekey_after_time+1))
+ echo ping4time=$(date)
$ping $ip_wg_peer
# A reinitiation should be performed
@@ -115,8 +121,6 @@ wg_rekey_body()
$HIJACKING wgconfig wg0 show peer peer0
destroy_wg_interfaces
-
- atf_fail "failed to trigger PR kern/56252"
}
wg_rekey_cleanup()
@@ -143,10 +147,9 @@ wg_handshake_timeout_body()
local ip_wg_local=10.0.0.1
local ip_wg_peer=10.0.0.2
local port=51820
- local rekey_after_time=3
local outfile=./out
- local rekey_timeout=3
- local rekey_attempt_time=8
+ local rekey_timeout=4
+ local rekey_attempt_time=10
local n=
setup_servers
@@ -198,8 +201,6 @@ wg_handshake_timeout_body()
n=$(grep "$ip_local.$port > $ip_peer.$port" $outfile |wc -l)
- atf_expect_fail "PR kern/56252"
-
# Give up handshaking after three attempts
atf_check_equal $n 3
@@ -208,8 +209,6 @@ wg_handshake_timeout_body()
export RUMP_SERVER=$SOCK_LOCAL
destroy_wg_interfaces
-
- atf_fail "failed to trigger PR kern/56252"
}
wg_handshake_timeout_cleanup()
@@ -271,8 +270,6 @@ wg_cookie_body()
# and a session doesn't start
$ping_fail $ip_wg_peer
- atf_expect_fail "PR kern/56252"
-
extract_new_packets $BUS > $outfile
$DEBUG && cat $outfile
# XXX length 64 indicates the message is a cookie message
@@ -296,8 +293,6 @@ wg_cookie_body()
$HIJACKING wgconfig wg0
destroy_wg_interfaces
-
- atf_fail "failed to trigger PR kern/56252"
}
wg_cookie_cleanup()
@@ -354,8 +349,6 @@ wg_mobility_body()
export RUMP_SERVER=$SOCK_LOCAL
$ping_fail $ip_wg_peer
- atf_expect_fail "PR kern/56252"
-
extract_new_packets $BUS > $outfile
$DEBUG && cat $outfile
@@ -394,8 +387,6 @@ wg_mobility_body()
atf_check -s exit:0 -o not-match:"$ip_local.$port > $ip_peer.$port" cat $outfile
destroy_wg_interfaces
-
- atf_fail "failed to trigger PR kern/56252"
}
wg_mobility_cleanup()
diff --git a/net/ipsec/t_ipsec_gif.sh b/net/ipsec/t_ipsec_gif.sh
index 5db21f994620..b05b089b2138 100644
--- a/net/ipsec/t_ipsec_gif.sh
+++ b/net/ipsec/t_ipsec_gif.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ipsec_gif.sh,v 1.9 2020/02/17 08:46:10 ozaki-r Exp $
+# $NetBSD: t_ipsec_gif.sh,v 1.10 2023/08/22 05:40:50 rin Exp $
#
# Copyright (c) 2017 Internet Initiative Japan Inc.
# All rights reserved.
@@ -49,11 +49,7 @@ make_gif_pktstr()
proto_cap=ESP
else
proto_cap=AH
- if [ $ipproto = ipv4 ]; then
- inner_str="$src_inner > $dst_inner:.+\(ipip-proto-4\)"
- else
- inner_str="$src_inner > $dst_inner"
- fi
+ inner_str="$src_inner > $dst_inner"
fi
echo "$src > $dst: $proto_cap.+$inner_str"
@@ -144,11 +140,9 @@ test_ipsec4_gif()
extract_new_packets $BUS_TUNNEL > $outfile
str="$ip_gwlo_tun > $ip_gwre_tun:"
str="$str $ip_local > $ip_remote: ICMP echo request,"
- str="$str .+ \(ipip-proto-4\)"
atf_check -s exit:0 -o match:"$str" cat $outfile
str="$ip_gwre_tun > $ip_gwlo_tun:"
str="$str $ip_remote > $ip_local: ICMP echo reply,"
- str="$str .+ \(ipip-proto-4\)"
atf_check -s exit:0 -o match:"$str" cat $outfile
if [ $mode = tunnel ]; then
diff --git a/net/ipsec/t_ipsec_l2tp.sh b/net/ipsec/t_ipsec_l2tp.sh
index fd191aff70b4..c2a3e550fd51 100644
--- a/net/ipsec/t_ipsec_l2tp.sh
+++ b/net/ipsec/t_ipsec_l2tp.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_ipsec_l2tp.sh,v 1.9 2020/02/17 08:46:10 ozaki-r Exp $
+# $NetBSD: t_ipsec_l2tp.sh,v 1.10 2023/08/22 05:40:50 rin Exp $
#
# Copyright (c) 2017 Internet Initiative Japan Inc.
# All rights reserved.
@@ -49,11 +49,7 @@ make_l2tp_pktstr()
else
proto_cap=AH
if [ $ipproto = ipv4 ]; then
- if [ $mode = tunnel ]; then
- proto_str="ip-proto-115 102 \(ipip-proto-4\)"
- else
- proto_str="ip-proto-115 102"
- fi
+ proto_str="ip-proto-115 102"
else
proto_str="ip-proto-115"
fi
diff --git a/net/net/t_forwarding.sh b/net/net/t_forwarding.sh
index 377984a8b16e..d3a2315de435 100644
--- a/net/net/t_forwarding.sh
+++ b/net/net/t_forwarding.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_forwarding.sh,v 1.20 2017/02/20 09:58:58 ozaki-r Exp $
+# $NetBSD: t_forwarding.sh,v 1.21 2025/06/27 21:36:23 andvar Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -69,7 +69,7 @@ ipforwarding_fastforward_v4_head()
ipforwarding_fastforward_v6_head()
{
- atf_set "descr" "Tests for IPv6 fastfoward"
+ atf_set "descr" "Tests for IPv6 fastforward"
atf_set "require.progs" "rump_server"
}
diff --git a/net/net/t_tcp.c b/net/net/t_tcp.c
index 7e48348aae85..4ca885d98b05 100644
--- a/net/net/t_tcp.c
+++ b/net/net/t_tcp.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_tcp.c,v 1.12 2021/11/08 10:57:09 rin Exp $ */
+/* $NetBSD: t_tcp.c,v 1.13 2024/08/23 07:13:50 rin Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#ifdef __RCSID
-__RCSID("$Id: t_tcp.c,v 1.12 2021/11/08 10:57:09 rin Exp $");
+__RCSID("$Id: t_tcp.c,v 1.13 2024/08/23 07:13:50 rin Exp $");
#endif
/* Example code. Should block; does with accept not accept4_. */
@@ -159,6 +159,10 @@ accept_test(sa_family_t sfamily, sa_family_t cfamily,
if (ok != -1 || errno != EINPROGRESS)
FAIL("expected connect to fail");
#endif
+
+ /* XXX avoid race between connect(2) and accept(2). */
+ sleep(1);
+
if (useaccept) {
acpt = accept(srvr, NULL, NULL);
} else {
diff --git a/net/net/t_unix.c b/net/net/t_unix.c
index 9551df20ec31..e20df33e5432 100644
--- a/net/net/t_unix.c
+++ b/net/net/t_unix.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_unix.c,v 1.25 2021/08/08 20:54:49 nia Exp $ */
+/* $NetBSD: t_unix.c,v 1.28 2025/03/27 11:01:07 riastradh Exp $ */
/*-
* Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -39,7 +39,7 @@
#define _GNU_SOURCE
#include <sys/cdefs.h>
#ifdef __RCSID
-__RCSID("$Id: t_unix.c,v 1.25 2021/08/08 20:54:49 nia Exp $");
+__RCSID("$Id: t_unix.c,v 1.28 2025/03/27 11:01:07 riastradh Exp $");
#else
#define getprogname() argv[0]
#endif
@@ -49,20 +49,24 @@ __RCSID("$Id: t_unix.c,v 1.25 2021/08/08 20:54:49 nia Exp $");
#else
#define LX
#endif
+
#include <sys/param.h>
+
#include <sys/socket.h>
+#include <sys/stat.h>
#include <sys/un.h>
#include <sys/wait.h>
-#include <sys/stat.h>
-#include <stdio.h>
+
#include <err.h>
#include <errno.h>
-#include <string.h>
+#include <poll.h>
+#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
+#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <unistd.h>
-#include <stdbool.h>
#include "test.h"
@@ -369,6 +373,8 @@ test(bool forkit, bool closeit, bool statit, size_t len)
free(sock_addr);
free(sun);
+ if (forkit && clntpid == getpid())
+ _exit(0);
return 0;
fail:
if (srvrpid == getpid()) {
@@ -383,11 +389,15 @@ fail:
}
free(sock_addr);
free(sun);
+ if (forkit && clntpid == getpid())
+ _exit(0);
return -1;
}
#ifndef TEST
+#include "h_macros.h"
+
ATF_TC(sockaddr_un_len_exceed);
ATF_TC_HEAD(sockaddr_un_len_exceed, tc)
{
@@ -432,6 +442,86 @@ ATF_TC_BODY(sockaddr_un_closed, tc)
"test(false, true, false, 100): %s", strerror(errno));
}
+ATF_TC(sockaddr_un_local_connwait);
+ATF_TC_HEAD(sockaddr_un_local_connwait, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "Check that LOCAL_CONNWAIT works");
+}
+
+ATF_TC_BODY(sockaddr_un_local_connwait, tc)
+{
+ /* too annoying to fit this into the test(...) framework above */
+ struct sockaddr_un sun = {.sun_family = AF_UNIX, .sun_path = "sock"};
+ int listener, conn, acc;
+ const int one = 1;
+ struct pollfd pfd;
+ int nfd, error;
+ socklen_t errorlen = sizeof(error);
+
+ /*
+ * Create and bind a listening socket.
+ */
+ RL(listener = socket(PF_LOCAL, SOCK_STREAM|SOCK_NONBLOCK, 0));
+ RL(bind(listener, (const struct sockaddr *)&sun, sizeof(sun)));
+ RL(listen(listener, 5));
+
+ /*
+ * Nobody's trying to connect, so accept would block.
+ */
+ ATF_REQUIRE_ERRNO(EAGAIN, accept(listener, NULL, NULL) == -1);
+
+ /*
+ * Connect should succeed immediately even though nobody is
+ * waiting to accept on the other end yet.
+ */
+ RL(conn = socket(PF_LOCAL, SOCK_STREAM|SOCK_NONBLOCK, 0));
+ RL(connect(conn, (const struct sockaddr *)&sun, sizeof(sun)));
+
+ /*
+ * Accept should succeed now that a client connected. Close
+ * both sides; we're done with this connection and will try
+ * again with LOCAL_CONNWAIT next.
+ */
+ RL(acc = accept(listener, NULL, NULL));
+ RL(close(acc));
+ RL(close(conn));
+
+ /*
+ * If we set LOCAL_CONNWAIT, connect should fail, but with
+ * EINPROGRESS -- note: not EAGAIN, because it has changed
+ * state. If we try to connect again, it should fail with
+ * EALREADY because the connection is already pending.
+ */
+ RL(conn = socket(PF_LOCAL, SOCK_STREAM|SOCK_NONBLOCK, 0));
+ RL(setsockopt(conn, SOL_LOCAL, LOCAL_CONNWAIT, &one, sizeof(one)));
+ ATF_REQUIRE_ERRNO(EINPROGRESS,
+ connect(conn, (const struct sockaddr *)&sun, sizeof(sun)) == -1);
+ ATF_REQUIRE_ERRNO(EALREADY,
+ connect(conn, (const struct sockaddr *)&sun, sizeof(sun)) == -1);
+
+ /*
+ * Accept should succeed immediately now.
+ */
+ RL(acc = accept(listener, NULL, NULL));
+
+ /*
+ * Verify via poll(2) that the pending connect(2) has finished
+ * -- it will report POLLOUT when that happens. And then
+ * verify that there was no error.
+ */
+ pfd = (struct pollfd){.fd = conn, .events = POLLOUT};
+ RL(nfd = poll(&pfd, 1, 0));
+ ATF_REQUIRE_MSG(pfd.revents & POLLOUT, "revents=0x%x", pfd.revents);
+ RL(getsockopt(conn, SOL_SOCKET, SO_ERROR, &error, &errorlen));
+ ATF_REQUIRE_MSG(errorlen == sizeof(error), "errorlen=%d", errorlen);
+ ATF_REQUIRE_MSG(error == 0, "error=%d", error);
+
+ RL(close(acc));
+ RL(close(conn));
+ RL(close(listener));
+}
+
ATF_TC(sockaddr_un_local_peereid);
ATF_TC_HEAD(sockaddr_un_local_peereid, tc)
{
@@ -466,6 +556,7 @@ ATF_TP_ADD_TCS(tp)
ATF_TP_ADD_TC(tp, sockaddr_un_len_exceed);
ATF_TP_ADD_TC(tp, sockaddr_un_len_max);
ATF_TP_ADD_TC(tp, sockaddr_un_closed);
+ ATF_TP_ADD_TC(tp, sockaddr_un_local_connwait);
ATF_TP_ADD_TC(tp, sockaddr_un_local_peereid);
ATF_TP_ADD_TC(tp, sockaddr_un_fstat);
return atf_no_error();
diff --git a/net/net_common.sh b/net/net_common.sh
index cf53217b1fdc..7e5783400258 100644
--- a/net/net_common.sh
+++ b/net/net_common.sh
@@ -1,4 +1,4 @@
-# $NetBSD: net_common.sh,v 1.44 2022/11/02 09:35:12 ozaki-r Exp $
+# $NetBSD: net_common.sh,v 1.45 2024/08/09 02:20:13 rin Exp $
#
# Copyright (c) 2016 Internet Initiative Japan Inc.
# All rights reserved.
@@ -527,7 +527,9 @@ rump_server_dump_buses()
cleanup()
{
- rump_server_halt_servers
+ if [ -f $_rump_server_socks ]; then
+ rump_server_halt_servers
+ fi
}
dump()
diff --git a/net/npf/Makefile b/net/npf/Makefile
index e73d8fcbe329..cc3bcc09efb5 100644
--- a/net/npf/Makefile
+++ b/net/npf/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.1 2012/09/12 14:06:31 martin Exp $
+# $NetBSD: Makefile,v 1.2 2025/07/20 12:25:54 joe Exp $
#
.include <bsd.own.mk>
@@ -8,5 +8,6 @@ FILESDIR= ${TESTSDIR}
TESTS_SH= t_npf
FILES= ../../../usr.sbin/npf/npftest/npftest.conf
+FILES+= ../../../usr.sbin/npf/npftest/npftestl3.conf
.include <bsd.test.mk>
diff --git a/net/npf/t_npf.sh b/net/npf/t_npf.sh
index a5b4c0da5d7b..4ca8e5580400 100644
--- a/net/npf/t_npf.sh
+++ b/net/npf/t_npf.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_npf.sh,v 1.4 2020/06/01 11:08:57 martin Exp $
+# $NetBSD: t_npf.sh,v 1.9 2025/07/20 12:25:54 joe Exp $
#
# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -29,22 +29,40 @@ run_test()
{
local name="${1}"
- atf_check -o ignore -e ignore npfctl debug -c "$(atf_get_srcdir)/npftest.conf" -o ./npf.plist
+ if [ "$name" = "l2defpass" ]; then
+ atf_check -o ignore -e ignore npfctl debug -c "$(atf_get_srcdir)/npftestl3.conf" -o ./npf.plist
+ else
+ atf_check -o ignore -e ignore npfctl debug -c "$(atf_get_srcdir)/npftest.conf" -o ./npf.plist
+ fi
+
atf_check -o ignore npftest -c npf.plist -T "${name}"
}
+cleanup()
+{
+
+ if [ -f npftest.core ]; then
+ gdb -batch -ex bt npftest npftest.core
+ # Extract kernel logs including a panic message
+ strings npftest.core |grep -E '^\[.+\] '
+ fi
+}
+
add_test()
{
local name="${1}"; shift
local desc="${*}";
- atf_test_case "npf_${name}"
+ atf_test_case "npf_${name}" cleanup
eval "npf_${name}_head() {
atf_set descr \"${desc}\"
atf_set require.progs npfctl npftest
}
npf_${name}_body() {
run_test ${name}
+ }
+ npf_${name}_cleanup() {
+ cleanup
}"
atf_add_test_case "npf_${name}"
}
diff --git a/rump/kernspace/threadpool.c b/rump/kernspace/threadpool.c
index d84eadc88ceb..2d81620db787 100644
--- a/rump/kernspace/threadpool.c
+++ b/rump/kernspace/threadpool.c
@@ -1,4 +1,4 @@
-/* $NetBSD: threadpool.c,v 1.5 2019/01/04 05:35:24 thorpej Exp $ */
+/* $NetBSD: threadpool.c,v 1.6 2024/02/02 21:52:23 andvar Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
#if !defined(lint)
-__RCSID("$NetBSD: threadpool.c,v 1.5 2019/01/04 05:35:24 thorpej Exp $");
+__RCSID("$NetBSD: threadpool.c,v 1.6 2024/02/02 21:52:23 andvar Exp $");
#endif /* !lint */
#include <sys/param.h>
@@ -223,7 +223,7 @@ rumptest_threadpool_job_cancel(void)
cv_wait(&data.cond, &data.mutex);
KASSERT(data.count == 1);
- /* Job is already running (and is not finished); this shold fail. */
+ /* Job is already running (and is not finished); this should fail. */
rv = threadpool_cancel_job_async(pool, &data.job);
KASSERT(rv == false);
diff --git a/rump/rumpkern/t_sp.sh b/rump/rumpkern/t_sp.sh
index 45b5d0b87527..39c3b99eeb9f 100644
--- a/rump/rumpkern/t_sp.sh
+++ b/rump/rumpkern/t_sp.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_sp.sh,v 1.17 2020/09/01 18:40:09 gson Exp $
+# $NetBSD: t_sp.sh,v 1.21 2025/04/02 14:37:44 riastradh Exp $
#
# Copyright (c) 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -66,6 +66,20 @@ test_case signal signal
# test_case reconnect reconnect
test_case_skip reconnect kern/55304 "leftover rump_server"
+RUN_CLIENT='
+ if "$@"; then
+ exit 0
+ else
+ status=$?
+ fi
+ RUMP_SERVER=unix://commsock rump.halt
+ echo Post-halt stdout:
+ cat stdout
+ echo Post-halt stderr: >&2
+ cat stderr >&2
+ exit $status
+'
+
basic()
{
export RUMP_SERVER=unix://commsock
@@ -105,9 +119,21 @@ sigsafe()
{
export RUMP_SERVER=unix://commsock
- atf_check -s exit:0 rump_server ${RUMP_SERVER}
- atf_check -s exit:0 $(atf_get_srcdir)/h_client/h_sigcli
-
+ export RUMP_STDOUT="$(pwd)/stdout"
+ export RUMP_STDERR="$(pwd)/stderr"
+ export RUMPUSER_DEBUG=1
+ atf_check -s exit:0 rump_server -v ${RUMP_SERVER}
+ echo Pre-test stdout:
+ cat stdout
+ echo Pre-test stderr: >&2
+ cat stderr >&2
+ atf_check -s exit:0 sh -c "$RUN_CLIENT" -- \
+ "$(atf_get_srcdir)"/h_client/h_sigcli
+ if [ -f rump_server.core ]; then
+ gdb -ex bt /usr/bin/rump_server rump_server.core
+ # Extract kernel logs including a panic message
+ strings rump_server.core |grep -E '^\[.+\] '
+ fi
}
signal()
diff --git a/rump/rumpkern/t_vm.c b/rump/rumpkern/t_vm.c
index 0217385a6dd6..ad80777a9a84 100644
--- a/rump/rumpkern/t_vm.c
+++ b/rump/rumpkern/t_vm.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_vm.c,v 1.7 2023/04/11 18:23:42 kre Exp $ */
+/* $NetBSD: t_vm.c,v 1.8 2025/04/02 11:28:00 riastradh Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -50,10 +50,9 @@ ATF_TC_HEAD(busypage, tc)
ATF_TC_BODY(busypage, tc)
{
-#if 0
- atf_tc_expect_fail("test bug: unbusies an uninitialized page");
-#endif
- atf_tc_skip("this test is buggy and hits an assertion, but atf doesn't provide any way to expect that a test program crashes, thus all we can do is skip");
+ atf_tc_expect_signal(SIGABRT,
+ "PR kern/55945: test bug: unbusies an uninitialized page");
+
rump_init();
rump_schedule();
diff --git a/sbin/fsck_ffs/quotas_common.sh b/sbin/fsck_ffs/quotas_common.sh
index 7d4ab58b9951..a2b8db80199a 100644
--- a/sbin/fsck_ffs/quotas_common.sh
+++ b/sbin/fsck_ffs/quotas_common.sh
@@ -1,4 +1,4 @@
-# $NetBSD: quotas_common.sh,v 1.2 2011/03/06 17:08:41 bouyer Exp $
+# $NetBSD: quotas_common.sh,v 1.3 2023/09/26 12:15:44 kre Exp $
create_with_quotas()
{
@@ -7,13 +7,13 @@ create_with_quotas()
local uid=$(id -u)
local gid=$(id -g)
- atf_check -o ignore -e ignore newfs -B ${endian} -O ${vers} \
- -s 4000 -F ${IMG}
- atf_check -o ignore -e ignore tunefs -q user -q group -F ${IMG}
+ atf_check -o ignore -e ignore newfs -B "${endian}" -O "${vers}" \
+ -s 4000 -F "${IMG}"
+ atf_check -o ignore -e ignore tunefs -q user -q group -F "${IMG}"
atf_check -s exit:0 -o 'match:NO USER QUOTA INODE \(CREATED\)' \
- -o 'match:USER QUOTA MISMATCH FOR ID '${uid}': 0/0 SHOULD BE 1/1' \
- -o 'match:GROUP QUOTA MISMATCH FOR ID '${gid}': 0/0 SHOULD BE 1/1' \
- fsck_ffs -p -F ${IMG}
+ -o "match:USER QUOTA MISMATCH FOR ID ${uid}: 0/0 SHOULD BE 1/1" \
+ -o "match:GROUP QUOTA MISMATCH FOR ID ${gid}: 0/0 SHOULD BE 1/1" \
+ fsck_ffs -p -F "${IMG}"
}
# from tests/ipf/h_common.sh via tests/sbin/resize_ffs
@@ -25,20 +25,23 @@ test_case()
atf_test_case "${name}"
- eval "${name}_head() { \
- atf_set "descr" "Checks ${descr} quotas inodes"
+ eval "${name}_head() {
+ atf_set descr 'Checks ${descr} quotas inodes'
}"
- eval "${name}_body() { \
- ${check_function} " "${@}" "; \
+ eval "${name}_body() {
+ ${check_function} $*
}"
- tests="${tests} ${name}"
+ tests="${tests} '${name}'"
}
atf_init_test_cases()
{
IMG=fsimage
DIR=target
- for i in ${tests}; do
- atf_add_test_case $i
+
+ eval "set -- ${tests}"
+ for i
+ do
+ atf_add_test_case "$i"
done
}
diff --git a/sbin/fsck_ffs/t_check_quotas.sh b/sbin/fsck_ffs/t_check_quotas.sh
index 804c5b54d772..cace96c53385 100644
--- a/sbin/fsck_ffs/t_check_quotas.sh
+++ b/sbin/fsck_ffs/t_check_quotas.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_check_quotas.sh,v 1.2 2011/03/06 17:08:41 bouyer Exp $
+# $NetBSD: t_check_quotas.sh,v 1.3 2023/09/26 12:15:44 kre Exp $
#
# Copyright (c) 2011 Manuel Bouyer
# All rights reserved.
@@ -27,27 +27,29 @@
for e in le be; do
for v in 1 2; do
- test_case corrupt_list_${e}_${v} corrupt_list \
- "recovery of corrupted free list in" ${e} ${v}
- test_case expand1_list_${e}_${v} expand_list \
- "allocation of direct block in" 40 ${e} ${v}
- test_case expand2_list_${e}_${v} expand_list \
- "allocation of indirect block in" 1000 ${e} ${v}
+ test_case "corrupt_list_${e}_${v}" corrupt_list \
+ "recovery of corrupted free list in" "${e}" "${v}"
+ test_case "expand1_list_${e}_${v}" expand_list \
+ "allocation of direct block in" 40 "${e}" "${v}"
+ test_case "expand2_list_${e}_${v}" expand_list \
+ "allocation of indirect block in" 1000 "${e}" "${v}"
done
done
corrupt_list()
{
- create_with_quotas $*
- local blkno=$(printf "inode 3\nblks\n" | /sbin/fsdb -nF -f ${IMG} | awk '$1 == "0:" {print $2}')
+ create_with_quotas "$@"
+ local blkno=$(printf "inode 3\nblks\n" |
+ /sbin/fsdb -nF -f "${IMG}" |
+ awk '$1 == "0:" {print $2}')
blkno=$(($blkno * 512 + 104))
#clear the free list
- atf_check -o ignore -e ignore dd if=/dev/zero of=${IMG} bs=1 \
- count=8 seek=${blkno} conv=notrunc
+ atf_check -o ignore -e ignore dd if=/dev/zero "of=${IMG}" bs=1 \
+ count=8 "seek=${blkno}" conv=notrunc
atf_check -s exit:0 \
-o "match:QUOTA ENTRY NOT IN LIST \(FIXED\)" \
- fsck_ffs -fp -F ${IMG}
- atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F ${IMG}
+ fsck_ffs -fp -F "${IMG}"
+ atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F "${IMG}"
}
expand_list()
@@ -57,17 +59,17 @@ expand_list()
echo "/set uid=0 gid=0" > spec
echo ". type=dir mode=0755" >> spec
mkdir ${DIR}
- for i in $(seq ${nuid}); do
- touch ${DIR}/f${i}
+ for i in $(seq "${nuid}"); do
+ touch "${DIR}/f${i}"
echo "./f$i type=file mode=0600 uid=$i gid=$i" >> spec
done
- atf_check -o ignore -e ignore makefs -B $1 -o version=$2 \
- -F spec -s 4000b ${IMG} ${DIR}
- atf_check -o ignore -e ignore tunefs -q user -F ${IMG}
+ atf_check -o ignore -e ignore makefs -B "$1" -o "version=$2" \
+ -F spec -s 4000b "${IMG}" "${DIR}"
+ atf_check -o ignore -e ignore tunefs -q user -F "${IMG}"
atf_check -s exit:0 -o 'match:NO USER QUOTA INODE \(CREATED\)' \
-o 'match:USER QUOTA MISMATCH FOR ID 10: 0/0 SHOULD BE 0/1' \
- fsck_ffs -p -F ${IMG}
+ fsck_ffs -p -F "${IMG}"
atf_check -s exit:0 -o "match:${expected_files} files" \
- fsck_ffs -nf -F ${IMG}
+ fsck_ffs -nf -F "${IMG}"
}
diff --git a/sbin/fsck_ffs/t_enable_quotas.sh b/sbin/fsck_ffs/t_enable_quotas.sh
index 706c8b03e52f..f441952c0275 100644
--- a/sbin/fsck_ffs/t_enable_quotas.sh
+++ b/sbin/fsck_ffs/t_enable_quotas.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_enable_quotas.sh,v 1.3 2021/09/16 22:19:12 andvar Exp $
+# $NetBSD: t_enable_quotas.sh,v 1.4 2023/09/26 12:15:44 kre Exp $
#
# Copyright (c) 2011 Manuel Bouyer
# All rights reserved.
@@ -27,79 +27,84 @@
for e in le be; do
for v in 1 2; do
- test_case disable_${e}_${v} disable_quotas "creation/removal of" ${e} ${v}
- test_case corrupt_${e}_${v} corrupt_quotas "repair of corrupted" ${e} ${v}
- test_case unallocated_${e}_${v} unallocated_quotas \
- "recovery of unallocated" ${e} ${v}
- test_case dir1_${e}_${v} dir1_quotas \
- "successful clear of wrong type of" ${e} ${v}
- test_case notreg_${e}_${v} notreg_quotas \
- "successful clear of wrong type of" ${e} ${v}
+ test_case "disable_${e}_${v}" disable_quotas \
+ "creation/removal of" "${e}" "${v}"
+ test_case "corrupt_${e}_${v}" corrupt_quotas \
+ "repair of corrupted" "${e}" "${v}"
+ test_case "unallocated_${e}_${v}" unallocated_quotas \
+ "recovery of unallocated" "${e}" "${v}"
+ test_case "dir1_${e}_${v}" dir1_quotas \
+ "successful clear of wrong type of" "${e}" "${v}"
+ test_case "notreg_${e}_${v}" notreg_quotas \
+ "successful clear of wrong type of" "${e}" "${v}"
done
done
disable_quotas()
{
- create_with_quotas $*
+ create_with_quotas "$@"
# check that the quota inode creation didn't corrupt the filesystem
atf_check -s exit:0 -o "match:already clean" -o "match:3 files" \
- fsck_ffs -nf -F ${IMG}
+ fsck_ffs -nf -F "${IMG}"
#now check fsck can properly clear the quota inode when quota flags are
# cleared
- atf_check -o ignore -e ignore tunefs -q nouser -q nogroup -F ${IMG}
+ atf_check -o ignore -e ignore tunefs -q nouser -q nogroup -F "${IMG}"
atf_check -s exit:0 -o "match:SUPERBLOCK QUOTA FLAG CLEARED" \
- fsck_ffs -fp -F ${IMG}
- atf_check -s exit:0 -o "match:1 files, 1 used" fsck_ffs -nf -F ${IMG}
+ fsck_ffs -fp -F "${IMG}"
+ atf_check -s exit:0 -o "match:1 files, 1 used" fsck_ffs -nf -F "${IMG}"
}
corrupt_quotas()
{
- create_with_quotas $*
+ create_with_quotas "$@"
- local blkno=$(printf "inode 3\nblks\n" | /sbin/fsdb -nF -f ${IMG} | awk '$1 == "0:" {print $2}')
- atf_check -o ignore -e ignore dd if=/dev/zero of=${IMG} bs=512 \
- count=1 seek=${blkno} conv=notrunc
+ local blkno=$(printf "inode 3\nblks\n" |
+ /sbin/fsdb -nF -f "${IMG}" |
+ awk '$1 == "0:" {print $2}')
+
+ atf_check -o ignore -e ignore dd if=/dev/zero "of=${IMG}" bs=512 \
+ count=1 "seek=${blkno}" conv=notrunc
atf_check -s exit:0 \
-o "match:CORRUPTED USER QUOTA INODE 3 \(CLEARED\)" \
-o "match:NO USER QUOTA INODE \(CREATED\)" \
- fsck_ffs -fp -F ${IMG}
- atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F ${IMG}
+ fsck_ffs -fp -F "${IMG}"
+ atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F "${IMG}"
}
unallocated_quotas()
{
- create_with_quotas $*
+ create_with_quotas "$@"
- atf_check -o ignore -e ignore clri ${IMG} 3
+ atf_check -o ignore -e ignore clri "${IMG}" 3
atf_check -s exit:0 \
-o "match:UNALLOCATED USER QUOTA INODE 3 \(CLEARED\)" \
-o "match:NO USER QUOTA INODE \(CREATED\)" \
- fsck_ffs -fp -F ${IMG}
- atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F ${IMG}
+ fsck_ffs -fp -F "${IMG}"
+ atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F "${IMG}"
}
dir1_quotas()
{
- create_with_quotas $*
+ create_with_quotas "$@"
atf_check -s exit:255 -o ignore -e ignore -x \
- "printf 'inode 3\nchtype dir\nexit\n' | fsdb -F -f ${IMG}"
+ "printf 'inode 3\nchtype dir\nexit\n' | fsdb -F -f '${IMG}'"
atf_check -s exit:0 \
-o "match:DIR I=3 CONNECTED. PARENT WAS I=0" \
-o "match:USER QUOTA INODE 3 IS A DIRECTORY" \
- fsck_ffs -y -F ${IMG}
+ fsck_ffs -y -F "${IMG}"
}
notreg_quotas()
{
- create_with_quotas $*
+ create_with_quotas "$@"
atf_check -s exit:255 -o ignore -e ignore -x \
- "printf 'inode 3\nchtype fifo\nexit\n' | fsdb -F -f ${IMG}"
+ "printf 'inode 3\nchtype fifo\nexit\n' | fsdb -F -f '${IMG}'"
atf_check -s exit:0 \
-o "match:WRONG TYPE 4096 for USER QUOTA INODE 3 \(CLEARED\)" \
-o "match:NO USER QUOTA INODE \(CREATED\)" \
- fsck_ffs -p -F ${IMG}
- atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F ${IMG}
+ fsck_ffs -p -F "${IMG}"
+ atf_check -s exit:0 -o "match:3 files" fsck_ffs -nf -F "${IMG}"
}
diff --git a/sbin/fsck_ffs/t_extattr.sh b/sbin/fsck_ffs/t_extattr.sh
index be980c1b8f3f..507a45f93253 100644
--- a/sbin/fsck_ffs/t_extattr.sh
+++ b/sbin/fsck_ffs/t_extattr.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_extattr.sh,v 1.4 2022/11/30 07:20:36 martin Exp $
+# $NetBSD: t_extattr.sh,v 1.6 2025/04/19 02:07:43 rin Exp $
#
# Copyright (c) 2021 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -38,8 +38,8 @@ atf_test_case fsck_extattr_disable cleanup
cleanup()
{
echo in cleanup
- umount -f ${MNT} > /dev/null 2>&1 || true
- vnconfig -u ${VND} > /dev/null 2>&1 || true
+ umount -f "${MNT}" > /dev/null 2>&1 || true
+ vnconfig -u "${VND}" > /dev/null 2>&1 || true
}
fsck_extattr_enable_head()
@@ -50,32 +50,36 @@ fsck_extattr_enable_head()
fsck_extattr_enable_body()
{
- atf_check mkdir -p ${MNT}
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
- atf_check -o ignore newfs -O2 -s 4m -F ${IMG}
- atf_check vnconfig ${VND} ${IMG}
+ atf_check mkdir -p "${MNT}"
+
+ atf_check -o ignore newfs -O2 -s 4m -F "${IMG}"
+ atf_check vnconfig "${VND}" "${IMG}"
# Verify that extattrs are disabled.
atf_check -o ignore -e 'match:POSIX1e ACLs not supported by this fs' \
- tunefs -p enable ${CDEV}
- atf_check mount -t ffs ${BDEV} ${MNT}
- atf_check touch ${MNT}/file
- atf_check -s exit:1 -e ignore setextattr user name1 value1 ${MNT}/file
- atf_check umount ${MNT}
+ tunefs -p enable "${CDEV}"
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
+ atf_check touch "${MNT}/file"
+ atf_check -s exit:1 -e ignore setextattr user name1 value1 "${MNT}/file"
+ atf_check umount "${MNT}"
# Enable extattrs.
atf_check -o 'match:ENABLING EXTATTR SUPPORT' \
- fsck_ffs -c ea ${CDEV}
+ fsck_ffs -c ea "${CDEV}"
# Verify that extattrs are now enabled.
atf_check -o 'match:POSIX1e ACLs set' -e ignore \
- tunefs -p enable ${CDEV}
- atf_check mount -t ffs ${BDEV} ${MNT}
- atf_check touch ${MNT}/file
- atf_check setextattr user testname testvalue ${MNT}/file
- atf_check -o 'match:testvalue' getextattr user testname ${MNT}/file
- atf_check umount ${MNT}
- atf_check vnconfig -u ${VND}
+ tunefs -p enable "${CDEV}"
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
+ atf_check touch "${MNT}/file"
+ atf_check setextattr user testname testvalue "${MNT}/file"
+ atf_check -o 'match:testvalue' getextattr user testname "${MNT}/file"
+ atf_check umount "${MNT}"
+ atf_check vnconfig -u "${VND}"
}
fsck_extattr_enable_cleanup()
@@ -91,49 +95,59 @@ fsck_extattr_enable_corrupted_head()
fsck_extattr_enable_corrupted_body()
{
- atf_check mkdir -p ${MNT}
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
+
+ atf_check mkdir -p "${MNT}"
# Create an fs with extattrs enabled and set an extattr on the test file.
- atf_check -o ignore newfs -O2ea -b 8k -f 1k -s 4m -F ${IMG}
- atf_check vnconfig ${VND} ${IMG}
+ atf_check -o ignore newfs -O2ea -b 8k -f 1k -s 4m -F "${IMG}"
+ atf_check vnconfig "${VND}" "${IMG}"
- atf_check mount -t ffs ${BDEV} ${MNT}
- atf_check touch ${MNT}/file
- atf_check setextattr user testname testvalue ${MNT}/file
- atf_check -o 'match:testvalue' getextattr user testname ${MNT}/file
- atf_check umount ${MNT}
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
+ atf_check touch "${MNT}/file"
+ atf_check setextattr user testname testvalue "${MNT}/file"
+ atf_check -o 'match:testvalue' getextattr user testname "${MNT}/file"
+ atf_check umount "${MNT}"
# Find the location and size of the extattr block.
- extb0=$(printf 'cd file\niptrs\n' | fsdb -n $CDEV | grep 'di_extb 0' |
+ extb0=$(printf 'cd file\niptrs\n' |
+ fsdb -n "$CDEV" |
+ grep 'di_extb 0' |
awk '{print $3}')
- extsize=$(printf 'cd file\n' | fsdb -n $CDEV | grep EXTSIZE | tail -1 |
- awk '{print $4}' | sed 's,.*=,,')
- atf_check [ $extb0 != 0 ]
- atf_check [ $extsize != 0 ]
+ extsize=$(printf 'cd file\n' |
+ fsdb -n "$CDEV" |
+ grep EXTSIZE |
+ tail -n 1 |
+ awk '{print $4}' |
+ sed 's,.*=,,')
+ atf_check [ "$extb0" != 0 ]
+ atf_check [ "$extsize" != 0 ]
# Recreate the fs with extattrs disabled and set the extattr block
# size/location of the new test file to the same values as the old
# test file. This simulates extattrs having been created in a
# UFS2-non-ea file system before UFS2ea was invented.
- atf_check -o ignore newfs -O2 -b 8k -f 1k -s 4m -F ${IMG}
- atf_check mount -t ffs ${BDEV} ${MNT}
- atf_check touch ${MNT}/file
- atf_check umount ${MNT}
- printf "cd file\nchextb 0 $extb0\n" | fsdb -N $CDEV
- printf "cd file\nchextsize $extsize\n" | fsdb -N $CDEV
+ atf_check -o ignore newfs -O2 -b 8k -f 1k -s 4m -F "${IMG}"
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
+ atf_check touch "${MNT}/file"
+ atf_check umount "${MNT}"
+ printf "cd file\nchextb 0 $extb0\n" | fsdb -N "$CDEV"
+ printf "cd file\nchextsize $extsize\n" | fsdb -N "$CDEV"
# Convert to enable extattrs.
atf_check -o 'match:CLEAR EXTATTR FIELDS' \
-o 'match:ENABLING EXTATTR SUPPORT' \
- fsck_ffs -y -c ea ${CDEV}
+ fsck_ffs -y -c ea "${CDEV}"
# Verify that the test file does not have the extattr.
- atf_check -o ignore fsck_ffs -n ${CDEV}
- atf_check mount -t ffs ${BDEV} ${MNT}
+ atf_check -o ignore fsck_ffs -n "${CDEV}"
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
atf_check -s exit:1 -e 'match:Attribute not found' \
- getextattr user testname ${MNT}/file
- atf_check umount ${MNT}
- atf_check vnconfig -u ${VND}
+ getextattr user testname "${MNT}/file"
+ atf_check umount "${MNT}"
+ atf_check vnconfig -u "${VND}"
}
fsck_extattr_enable_corrupted_cleanup()
@@ -149,42 +163,47 @@ fsck_extattr_disable_head()
fsck_extattr_disable_body()
{
- atf_check mkdir -p ${MNT}
+ if [ $(uname -p) = vax ]; then
+ atf_skip "port-vax/59287 vnd(4) can cause kernel crash"
+ fi
+
+ atf_check mkdir -p "${MNT}"
# Create an fs with extattrs enabled and set an extattr on the test file.
- atf_check -o ignore newfs -O2ea -b 8k -f 1k -s 4m -F ${IMG}
- atf_check vnconfig ${VND} ${IMG}
+ atf_check -o ignore newfs -O2ea -b 8k -f 1k -s 4m -F "${IMG}"
+ atf_check vnconfig "${VND}" "${IMG}"
- atf_check mount -t ffs ${BDEV} ${MNT}
- atf_check touch ${MNT}/file
- atf_check setextattr user testname testvalue ${MNT}/file
- atf_check -o 'match:testvalue' getextattr user testname ${MNT}/file
- atf_check umount ${MNT}
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
+ atf_check touch "${MNT}/file"
+ atf_check setextattr user testname testvalue "${MNT}/file"
+ atf_check -o 'match:testvalue' getextattr user testname "${MNT}/file"
+ atf_check umount "${MNT}"
# Convert to disable extattrs.
atf_check -o 'match:CLEAR EXTATTR FIELDS' \
-o 'match:DISABLING EXTATTR SUPPORT' \
- fsck_ffs -y -c no-ea ${CDEV}
+ fsck_ffs -y -c no-ea "${CDEV}"
# Verify that the test file does not have the test extattr.
- atf_check -o ignore fsck_ffs -n ${CDEV}
- atf_check mount -t ffs ${BDEV} ${MNT}
- atf_check -s exit:1 -e 'match:getextattr: mnt/file: failed: Operation not supported' \
- getextattr user testname ${MNT}/file
- atf_check umount ${MNT}
+ atf_check -o ignore fsck_ffs -n "${CDEV}"
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
+ atf_check -s exit:1 \
+ -e 'match:getextattr: mnt/file: failed: Operation not supported' \
+ getextattr user testname "${MNT}/file"
+ atf_check umount "${MNT}"
# Convert to enable extattrs again.
atf_check -o 'match:ENABLING EXTATTR SUPPORT' \
fsck_ffs -y -c ea ${CDEV}
# Verify that the test extattr is still gone.
- atf_check -o ignore fsck_ffs -n ${CDEV}
- atf_check mount -t ffs ${BDEV} ${MNT}
+ atf_check -o ignore fsck_ffs -n "${CDEV}"
+ atf_check mount -t ffs "${BDEV}" "${MNT}"
atf_check -s exit:1 -e 'match:Attribute not found' \
- getextattr user testname ${MNT}/file
- atf_check umount ${MNT}
+ getextattr user testname "${MNT}/file"
+ atf_check umount "${MNT}"
- atf_check vnconfig -u ${VND}
+ atf_check vnconfig -u "${VND}"
}
fsck_extattr_disable_cleanup()
diff --git a/sbin/gpt/Makefile b/sbin/gpt/Makefile
index c6b6cab353de..604e75b1f094 100644
--- a/sbin/gpt/Makefile
+++ b/sbin/gpt/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.8 2015/12/05 18:52:11 christos Exp $
+# $NetBSD: Makefile,v 1.9 2026/02/10 03:27:48 kre Exp $
.include <bsd.own.mk>
@@ -10,6 +10,12 @@ FILESDIR= ${TESTSDIR}
FILES= gpt.empty.show.normal gpt.backup gpt.removepart.show.normal
FILES+= gpt.2part.show.uuid gpt.2part.show.normal gpt.2part.show.label
FILES+= gpt.resizedisk.show.normal gpt.resizepart.show.normal
-FILES+= gpt.disklabel gpt.disklabel.show.normal
+FILES+= gpt.disklabel gpt.disklabel.show.normal gpt.empty.show.clean
+
+FILES+= gpt.2part.show.label-p gpt.2part.show.normal-p
+FILES+= gpt.2part.show.uuid-p gpt.disklabel.show.normal-p
+FILES+= gpt.empty.show.clean-p gpt.empty.show.normal-p
+FILES+= gpt.removepart.show.normal-p gpt.resizedisk.show.normal-p
+FILES+= gpt.resizepart.show.normal-p
.include <bsd.test.mk>
diff --git a/sbin/gpt/gpt.2part.show.label b/sbin/gpt/gpt.2part.show.label
index dfb2b9981ada..ce9c6cbf6370 100644
--- a/sbin/gpt/gpt.2part.show.label
+++ b/sbin/gpt/gpt.2part.show.label
@@ -1,8 +1,8 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 1024 1 GPT part - potato
- 1058 9150 2 GPT part - tomato
- 10208 32 Sec GPT table
- 10240 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 1024 1 GPT part - potato
+ 1058 9150 2 GPT part - tomato
+ 10208 32 Sec GPT table
+ 10240 1 Sec GPT header
diff --git a/sbin/gpt/gpt.2part.show.normal b/sbin/gpt/gpt.2part.show.normal
index 667c4d8d4f12..010bcd5f1088 100644
--- a/sbin/gpt/gpt.2part.show.normal
+++ b/sbin/gpt/gpt.2part.show.normal
@@ -1,8 +1,8 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 1024 1 GPT part - EFI System
- 1058 9150 2 GPT part - NetBSD FFSv1/FFSv2
- 10208 32 Sec GPT table
- 10240 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 1024 1 GPT part - EFI System
+ 1058 9150 2 GPT part - NetBSD FFSv1/FFSv2
+ 10208 32 Sec GPT table
+ 10240 1 Sec GPT header
diff --git a/sbin/gpt/gpt.2part.show.uuid b/sbin/gpt/gpt.2part.show.uuid
index 77c41cc8af5a..b5685c2c43a0 100644
--- a/sbin/gpt/gpt.2part.show.uuid
+++ b/sbin/gpt/gpt.2part.show.uuid
@@ -1,8 +1,8 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 1024 1 GPT part - c12a7328-f81f-11d2-ba4b-00a0c93ec93b
- 1058 9150 2 GPT part - 49f48d5a-b10e-11dc-b99b-0019d1879648
- 10208 32 Sec GPT table
- 10240 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 1024 1 GPT part - c12a7328-f81f-11d2-ba4b-00a0c93ec93b
+ 1058 9150 2 GPT part - 49f48d5a-b10e-11dc-b99b-0019d1879648
+ 10208 32 Sec GPT table
+ 10240 1 Sec GPT header
diff --git a/sbin/gpt/gpt.disklabel.show.normal b/sbin/gpt/gpt.disklabel.show.normal
index 5d937077f6c6..a024e57da171 100644
--- a/sbin/gpt/gpt.disklabel.show.normal
+++ b/sbin/gpt/gpt.disklabel.show.normal
@@ -1,12 +1,12 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 29 Unused
- 63 500 1 GPT part - NetBSD FFSv1/FFSv2
- 563 1000 2 GPT part - NetBSD swap
- 1563 1000 3 GPT part - NetBSD FFSv1/FFSv2
- 2563 400 4 GPT part - Windows basic data
- 2963 7245 Unused
- 10208 32 Sec GPT table
- 10240 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 29 Unused
+ 63 500 1 GPT part - NetBSD FFSv1/FFSv2
+ 563 1000 2 GPT part - NetBSD swap
+ 1563 1000 3 GPT part - NetBSD FFSv1/FFSv2
+ 2563 400 4 GPT part - Windows basic data
+ 2963 7245 Unused
+ 10208 32 Sec GPT table
+ 10240 1 Sec GPT header
diff --git a/sbin/gpt/gpt.empty.show.normal b/sbin/gpt/gpt.empty.show.normal
index e55c5a91873a..0172c2f47e72 100644
--- a/sbin/gpt/gpt.empty.show.normal
+++ b/sbin/gpt/gpt.empty.show.normal
@@ -1,7 +1,7 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 10174 Unused
- 10208 32 Sec GPT table
- 10240 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 10174 Unused
+ 10208 32 Sec GPT table
+ 10240 1 Sec GPT header
diff --git a/sbin/gpt/gpt.removepart.show.normal b/sbin/gpt/gpt.removepart.show.normal
index bf8943168cbd..06b8d4179c77 100644
--- a/sbin/gpt/gpt.removepart.show.normal
+++ b/sbin/gpt/gpt.removepart.show.normal
@@ -1,8 +1,8 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 1024 Unused
- 1058 9150 2 GPT part - NetBSD FFSv1/FFSv2
- 10208 32 Sec GPT table
- 10240 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 1024 Unused
+ 1058 9150 2 GPT part - NetBSD FFSv1/FFSv2
+ 10208 32 Sec GPT table
+ 10240 1 Sec GPT header
diff --git a/sbin/gpt/gpt.resizedisk.show.normal b/sbin/gpt/gpt.resizedisk.show.normal
index a3280286c5b6..6d0e5e9e384e 100644
--- a/sbin/gpt/gpt.resizedisk.show.normal
+++ b/sbin/gpt/gpt.resizedisk.show.normal
@@ -1,9 +1,9 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 1024 1 GPT part - EFI System
- 1058 9150 2 GPT part - NetBSD FFSv1/FFSv2
- 10208 10240 Unused
- 20448 32 Sec GPT table
- 20480 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 1024 1 GPT part - EFI System
+ 1058 9150 2 GPT part - NetBSD FFSv1/FFSv2
+ 10208 10240 Unused
+ 20448 32 Sec GPT table
+ 20480 1 Sec GPT header
diff --git a/sbin/gpt/gpt.resizepart.show.normal b/sbin/gpt/gpt.resizepart.show.normal
index 6228a632248c..c07125df46c3 100644
--- a/sbin/gpt/gpt.resizepart.show.normal
+++ b/sbin/gpt/gpt.resizepart.show.normal
@@ -1,8 +1,8 @@
- start size index contents
- 0 1 PMBR
- 1 1 Pri GPT header
- 2 32 Pri GPT table
- 34 1024 1 GPT part - EFI System
- 1058 19390 2 GPT part - NetBSD FFSv1/FFSv2
- 20448 32 Sec GPT table
- 20480 1 Sec GPT header
+ start size index contents
+ 0 1 PMBR
+ 1 1 Pri GPT header
+ 2 32 Pri GPT table
+ 34 1024 1 GPT part - EFI System
+ 1058 19390 2 GPT part - NetBSD FFSv1/FFSv2
+ 20448 32 Sec GPT table
+ 20480 1 Sec GPT header
diff --git a/sbin/gpt/t_gpt.sh b/sbin/gpt/t_gpt.sh
index 3599b57406c2..42d97b525c2d 100644
--- a/sbin/gpt/t_gpt.sh
+++ b/sbin/gpt/t_gpt.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_gpt.sh,v 1.17 2022/11/21 16:06:00 kre Exp $
+# $NetBSD: t_gpt.sh,v 1.18 2026/02/09 23:20:42 kre Exp $
#
# Copyright (c) 2015 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -82,15 +82,17 @@ prepare() {
prepare_2part() {
prepare
- silence gpt create "$disk"
- match "$(partaddmsg 1 34 1024)" gpt add -t efi -s 1024 "$disk"
- match "$(partaddmsg 2 1058 9150)" gpt add "$disk"
+ silence gpt -T0 create "$disk"
+ match "$(partaddmsg 1 34 1024)" gpt -T1 add -t efi -s 1024 "$disk"
+ match "$(partaddmsg 2 1058 9150)" gpt -T2 add "$disk"
}
# Calling this from tests does not work. BUG!
check_2part() {
file "$src/gpt.2part.show.normal" gpt show "$disk"
+ file "$src/gpt.2part.show.normal-p" gpt show -p "$disk"
file "$src/gpt.2part.show.uuid" gpt show -u "$disk"
+ file "$src/gpt.2part.show.uuid-p" gpt show -p -u "$disk"
}
partaddmsg() {
@@ -137,8 +139,11 @@ create_empty_head() {
create_empty_body() {
prepare
+ file "$src/gpt.empty.show.clean" gpt show "$disk"
+ file "$src/gpt.empty.show.clean-p" gpt show -p "$disk"
silence gpt create "$disk"
file "$src/gpt.empty.show.normal" gpt show "$disk"
+ file "$src/gpt.empty.show.normal-p" gpt show -p "$disk"
}
atf_test_case create_2part
@@ -241,8 +246,10 @@ resize_2part_body() {
zerodd seek="$newsize" count=1
match 'Moving secondary GPT header' gpt resizedisk "$disk"
file "$src/gpt.resizedisk.show.normal" gpt show "$disk"
+ file "$src/gpt.resizedisk.show.normal-p" gpt show -p "$disk"
match "$(partresmsg 2 1058 19390)" gpt resize -i 2 "$disk"
file "$src/gpt.resizepart.show.normal" gpt show "$disk"
+ file "$src/gpt.resizepart.show.normal-p" gpt show -p "$disk"
}
atf_test_case remove_2part
@@ -256,6 +263,8 @@ remove_2part_body() {
-i 1 "$disk"
file "$src/gpt.removepart.show.normal" \
gpt show "$disk"
+ file "$src/gpt.removepart.show.normal-p" \
+ gpt show -p "$disk"
}
atf_test_case label_2part
@@ -269,6 +278,8 @@ label_2part_body() {
match "$(partlblmsg 2)" gpt label -i 2 -l tomato "$disk"
file "$src/gpt.2part.show.label" \
gpt show -l "$disk"
+ file "$src/gpt.2part.show.label-p" \
+ gpt show -lp "$disk"
}
atf_test_case bootable_2part
@@ -301,8 +312,9 @@ migrate_disklabel_body() {
silence fdisk -fi "$disk"
silence fdisk -fu0s "169/63/$((size / 10))" "$disk"
silence disklabel -R "$disk" "$src/gpt.disklabel"
- matcherr "$(migratemsg 5)" gpt migrate "$disk"
+ matcherr "$(migratemsg 5)" gpt -T0 migrate "$disk"
file "$src/gpt.disklabel.show.normal" gpt show "$disk"
+ file "$src/gpt.disklabel.show.normal-p" gpt show -p "$disk"
}
atf_init_test_cases() {
diff --git a/sbin/ifconfig/t_capabilities.sh b/sbin/ifconfig/t_capabilities.sh
index 7d0b2fabe48a..261f88f00874 100644
--- a/sbin/ifconfig/t_capabilities.sh
+++ b/sbin/ifconfig/t_capabilities.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_capabilities.sh,v 1.1 2020/06/27 06:57:44 jruoho Exp $
+# $NetBSD: t_capabilities.sh,v 1.3 2023/10/18 08:52:46 rin Exp $
#
# Copyright (c) 2020 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -111,6 +111,10 @@ basic_head() {
basic_body() {
+ if ! [ $(atf_config_get "run_unsafe" "no") = "yes" ]; then
+ atf_skip "modify if_capenable for real interfaces"
+ fi
+
for i in $(ifconfig -l); do
c=$(ifconfig $i | grep "capabilities")
diff --git a/sbin/newfs_msdos/t_create.sh b/sbin/newfs_msdos/t_create.sh
index f6f5e91cde93..765f78fda1a1 100644
--- a/sbin/newfs_msdos/t_create.sh
+++ b/sbin/newfs_msdos/t_create.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_create.sh,v 1.4 2020/03/15 10:15:16 martin Exp $
+# $NetBSD: t_create.sh,v 1.5 2024/04/28 07:27:42 rillig Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -36,11 +36,11 @@ validfat32_body() {
atf_skip "not enough free space in working directory"
fi
- atf_check -s eq:0 -o ignore -e ignore \
+ atf_check -s exit:0 -o ignore -e ignore \
newfs_msdos -b 512 -C 33m -F 32 msdos.img
# fsck_msdos/newfs_msdos have been fixed
# atf_expect_fail "PR bin/46743"
- atf_check -s eq:0 -o not-match:FIXED -e empty fsck_msdos -p msdos.img
+ atf_check -s exit:0 -o not-match:FIXED -e empty fsck_msdos -p msdos.img
atf_expect_pass
}
diff --git a/sys/crypto/aes/Makefile b/sys/crypto/aes/Makefile
index fe569c19684d..bfa075343774 100644
--- a/sys/crypto/aes/Makefile
+++ b/sys/crypto/aes/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.7 2023/08/08 06:27:32 mrg Exp $
+# $NetBSD: Makefile,v 1.11 2025/11/24 16:28:51 nia Exp $
.include <bsd.own.mk>
@@ -17,6 +17,13 @@ SRCS.t_aes+= aes_bear.c
SRCS.t_aes+= aes_ct.c
SRCS.t_aes+= aes_ct_dec.c
SRCS.t_aes+= aes_ct_enc.c
+
+SRCS.t_aes+= aes_bear64.c
+SRCS.t_aes+= aes_ct64.c
+SRCS.t_aes+= aes_ct64_dec.c
+SRCS.t_aes+= aes_ct64_enc.c
+
+SRCS.t_aes+= aes_keysched.c
SRCS.t_aes+= aes_selftest.c
.if !empty(MACHINE_ARCH:Mearmv7*) || !empty(MACHINE_ARCH:Maarch64*)
@@ -58,15 +65,15 @@ SRCS.t_aes+= aes_ni.c
SRCS.t_aes+= aes_ni_64.S
.endif
-SRCS.t_aes+= aes_sse2.c
-SRCS.t_aes+= aes_sse2_dec.c
-SRCS.t_aes+= aes_sse2_enc.c
-SRCS.t_aes+= aes_sse2_impl.c
-SRCS.t_aes+= aes_sse2_subr.c
-COPTS.aes_sse2.c+= -msse -msse2
-COPTS.aes_sse2_dec.c+= -msse -msse2
-COPTS.aes_sse2_enc.c+= -msse -msse2
-COPTS.aes_sse2_subr.c+= -msse -msse2
+SRCS.t_aes+= aes_sse2_4x32.c
+SRCS.t_aes+= aes_sse2_4x32_dec.c
+SRCS.t_aes+= aes_sse2_4x32_enc.c
+SRCS.t_aes+= aes_sse2_4x32_impl.c
+SRCS.t_aes+= aes_sse2_4x32_subr.c
+COPTS.aes_sse2_4x32.c+= -msse -msse2
+COPTS.aes_sse2_4x32_dec.c+= -msse -msse2
+COPTS.aes_sse2_4x32_enc.c+= -msse -msse2
+COPTS.aes_sse2_4x32_subr.c+= -msse -msse2
SRCS.t_aes+= aes_ssse3.c
SRCS.t_aes+= aes_ssse3_impl.c
@@ -84,10 +91,12 @@ WARNS= 5
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110878
COPTS.aes_armv8.c+= ${CC_WNO_STRINGOP_OVERREAD} ${CC_WNO_STRINGOP_OVERFLOW}
COPTS.aes_bear.c+= ${CC_WNO_STRINGOP_OVERFLOW} ${CC_WNO_ARRAY_BOUNDS}
+COPTS.aes_bear64.c+= ${CC_WNO_STRINGOP_OVERFLOW} ${CC_WNO_ARRAY_BOUNDS} \
+ ${CC_WNO_STRINGOP_OVERREAD}
COPTS.aes_neon_subr.c+= ${CC_WNO_ARRAY_BOUNDS}
COPTS.aes_ni.c+= ${CC_WNO_STRINGOP_OVERREAD} ${CC_WNO_STRINGOP_OVERFLOW}
-COPTS.aes_sse2_subr.c+= ${CC_WNO_ARRAY_BOUNDS}
+COPTS.aes_sse2_4x32_subr.c+= ${CC_WNO_ARRAY_BOUNDS}
COPTS.aes_ssse3_subr.c+=${CC_WNO_ARRAY_BOUNDS}
COPTS.aes_via.c+= ${CC_WNO_ARRAY_BOUNDS}
diff --git a/sys/crypto/aes/t_aes.c b/sys/crypto/aes/t_aes.c
index f87ddf401db0..79bf0262f6aa 100644
--- a/sys/crypto/aes/t_aes.c
+++ b/sys/crypto/aes/t_aes.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_aes.c,v 1.4 2020/08/17 16:26:02 riastradh Exp $ */
+/* $NetBSD: t_aes.c,v 1.6 2025/11/23 22:48:27 riastradh Exp $ */
/*-
* Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -30,11 +30,12 @@
#include <crypto/aes/aes.h>
#include <crypto/aes/aes_bear.h>
+#include <crypto/aes/aes_bear64.h>
#include <crypto/aes/aes_impl.h>
#if defined(__i386__) || defined(__x86_64__)
#include <crypto/aes/arch/x86/aes_ni.h>
-#include <crypto/aes/arch/x86/aes_sse2.h>
+#include <crypto/aes/arch/x86/aes_sse2_4x32.h>
#include <crypto/aes/arch/x86/aes_ssse3.h>
#include <crypto/aes/arch/x86/aes_via.h>
#endif
@@ -71,6 +72,28 @@ ATF_TC_BODY(aes_ct_selftest, tc)
atf_tc_fail("BearSSL aes_ct self-test failed");
}
+ATF_TC(aes_ct64_selftest);
+ATF_TC_HEAD(aes_ct64_selftest, tc)
+{
+
+ atf_tc_set_md_var(tc, "descr", "BearSSL aes_ct64 tests");
+}
+
+ATF_TC_BODY(aes_ct64_selftest, tc)
+{
+
+ if (aes_bear64_impl.ai_probe()) {
+ /*
+ * aes_ct64 is the portable software fallback for LP64
+ * platforms, so probe should never fail.
+ */
+ atf_tc_fail("BearSSL aes_ct probe64 failed");
+ }
+
+ if (aes_selftest(&aes_bear64_impl))
+ atf_tc_fail("BearSSL aes_ct64 self-test failed");
+}
+
#define AES_SELFTEST(name, impl, descr) \
ATF_TC(name); \
ATF_TC_HEAD(name, tc) \
@@ -102,8 +125,8 @@ AES_SELFTEST(aes_ni_selftest, &aes_ni_impl, "Intel AES-NI self-test")
#endif
#if defined(__i386__) || defined(__x86_64__)
-AES_SELFTEST(aes_sse2_selftest, &aes_sse2_impl,
- "Intel SSE2 bitsliced self-test")
+AES_SELFTEST(aes_sse2_4x32_selftest, &aes_sse2_4x32_impl,
+ "Intel SSE2 4x32 bitsliced self-test")
AES_SELFTEST(aes_ssse3_selftest, &aes_ssse3_impl,
"Intel SSSE3 vpaes self-test")
AES_SELFTEST(aes_via_selftest, &aes_via_impl, "VIA ACE AES self-test")
@@ -113,6 +136,7 @@ ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, aes_ct_selftest);
+ ATF_TP_ADD_TC(tp, aes_ct64_selftest);
#ifdef __aarch64__
ATF_TP_ADD_TC(tp, aes_armv8_selftest);
@@ -127,7 +151,7 @@ ATF_TP_ADD_TCS(tp)
#endif
#if defined(__i386__) || defined(__x86_64__)
- ATF_TP_ADD_TC(tp, aes_sse2_selftest);
+ ATF_TP_ADD_TC(tp, aes_sse2_4x32_selftest);
ATF_TP_ADD_TC(tp, aes_ssse3_selftest);
ATF_TP_ADD_TC(tp, aes_via_selftest);
#endif
diff --git a/sys/crypto/chacha/Makefile b/sys/crypto/chacha/Makefile
index 6882d015495c..32a57f3f53a0 100644
--- a/sys/crypto/chacha/Makefile
+++ b/sys/crypto/chacha/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.6 2020/09/08 17:35:27 jakllsch Exp $
+# $NetBSD: Makefile,v 1.8 2023/09/05 22:14:08 mrg Exp $
.include <bsd.own.mk>
@@ -47,6 +47,8 @@ CPPFLAGS+= -I${NETBSDSRCDIR}/sys/crypto/chacha/arch/x86
SRCS.t_chacha+= chacha_sse2.c
SRCS.t_chacha+= chacha_sse2_impl.c
COPTS.chacha_sse2.c+= -msse -msse2
+# XXXGCC12 - believes subkey[] is maybe uninitialised, but it is not.
+COPTS.chacha_sse2.c+= ${${ACTIVE_CC} == "gcc":? -Wno-maybe-uninitialized :}
.endif # x86
diff --git a/sys/rc/h_args.sh b/sys/rc/h_args.sh
index 2b03f294bc6a..fad8a93bedfa 100755
--- a/sys/rc/h_args.sh
+++ b/sys/rc/h_args.sh
@@ -1,6 +1,6 @@
#! /bin/sh
#
-# $NetBSD: h_args.sh,v 1.1 2010/03/15 19:03:08 jmmv Exp $
+# $NetBSD: h_args.sh,v 1.2 2025/09/07 21:31:21 andvar Exp $
#
# Copyright (c) 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -31,7 +31,7 @@
#
#
-# An rc.d script that overrides all standard comands and adds a non-standard
+# An rc.d script that overrides all standard commands and adds a non-standard
# command. All of them print the set of arguments passed to them and take no
# further action.
#
diff --git a/sys/rc/t_rc_d_cli.sh b/sys/rc/t_rc_d_cli.sh
index 271d02fa2648..237c5ff2e9eb 100644
--- a/sys/rc/t_rc_d_cli.sh
+++ b/sys/rc/t_rc_d_cli.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_rc_d_cli.sh,v 1.5 2022/02/26 16:21:59 gson Exp $
+# $NetBSD: t_rc_d_cli.sh,v 1.6 2024/04/28 07:27:42 rillig Exp $
#
# Copyright (c) 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -36,7 +36,7 @@ no_command_body() {
export h_simple=YES
rc_helper=$(atf_get_srcdir)/h_simple
- atf_check -s eq:1 -o empty -e ignore ${rc_helper}
+ atf_check -s exit:1 -o empty -e ignore ${rc_helper}
}
atf_test_case default_start_no_args
@@ -49,7 +49,7 @@ default_start_no_args_body() {
rc_helper=$(atf_get_srcdir)/h_simple
atf_expect_fail "PR bin/56506"
- atf_check -s eq:0 -o ignore -e empty ${rc_helper} start
+ atf_check -s exit:0 -o ignore -e empty ${rc_helper} start
${rc_helper} forcestop
atf_fail "random failure did not happen this time"
}
@@ -63,7 +63,7 @@ default_start_with_args_body() {
export h_simple=YES
rc_helper=$(atf_get_srcdir)/h_simple
- atf_check -s eq:1 -o ignore -e ignore ${rc_helper} start foo
+ atf_check -s exit:1 -o ignore -e ignore ${rc_helper} start foo
if ${rc_helper} status >/dev/null; then
${rc_helper} forcestop
atf_fail 'extra argument to start did not error out'
@@ -81,7 +81,7 @@ default_stop_no_args_body() {
atf_expect_fail "PR bin/56506"
${rc_helper} start
- atf_check -s eq:0 -o ignore -e empty ${rc_helper} stop
+ atf_check -s exit:0 -o ignore -e empty ${rc_helper} stop
atf_fail "random failure did not happen this time"
}
@@ -95,7 +95,7 @@ default_stop_with_args_body() {
rc_helper=$(atf_get_srcdir)/h_simple
${rc_helper} start
- atf_check -s eq:1 -o ignore -e ignore ${rc_helper} stop foo
+ atf_check -s exit:1 -o ignore -e ignore ${rc_helper} stop foo
if ${rc_helper} status >/dev/null; then
${rc_helper} forcestop
else
@@ -114,7 +114,7 @@ default_restart_no_args_body() {
atf_expect_fail "PR bin/56506"
${rc_helper} start
- atf_check -s eq:0 -o ignore -e empty ${rc_helper} restart
+ atf_check -s exit:0 -o ignore -e empty ${rc_helper} restart
${rc_helper} forcestop
atf_fail "random failure did not happen this time"
}
@@ -129,7 +129,7 @@ default_restart_with_args_body() {
rc_helper=$(atf_get_srcdir)/h_simple
${rc_helper} start
- atf_check -s eq:1 -o ignore -e ignore ${rc_helper} restart foo
+ atf_check -s exit:1 -o ignore -e ignore ${rc_helper} restart foo
${rc_helper} forcestop
}
@@ -144,7 +144,7 @@ pre${command}:.
${command}:.
post${command}:.
EOF
- atf_check -s eq:0 -o file:expout -e empty ${rc_helper} ${command}
+ atf_check -s exit:0 -o file:expout -e empty ${rc_helper} ${command}
}
do_overriden_with_args() {
@@ -158,7 +158,7 @@ pre${command}:.
${command}: >arg1< > arg 2 < >arg3< >*<.
post${command}:.
EOF
- atf_check -s eq:0 -o file:expout -e empty ${rc_helper} ${command} \
+ atf_check -s exit:0 -o file:expout -e empty ${rc_helper} ${command} \
'arg1' ' arg 2 ' 'arg3' '*'
}
diff --git a/usr.bin/Makefile b/usr.bin/Makefile
index c28f28b90b37..adc6e8d6fa0d 100644
--- a/usr.bin/Makefile
+++ b/usr.bin/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.37 2022/07/21 09:52:48 kre Exp $
+# $NetBSD: Makefile,v 1.45 2026/01/30 09:01:08 wiz Exp $
#
.include <bsd.own.mk>
@@ -6,11 +6,12 @@
TESTSDIR= ${TESTSBASE}/usr.bin
TESTS_SUBDIRS= awk basename bzip2 cc cmp compress config cpio col cut \
- diff dirname find fstat gdb grep gzip id indent \
- infocmp jot ld locale m4 make mixerctl mkdep nbperf \
- netpgpverify patch pkill pr printf pwhash realpath rump_server \
- shmif_dumpbus sdiff sed sort tar tmux tr unifdef uniq \
- vmstat xlint ztest
+ diff diff3 dirname error find fstat ftp gcov gdb grep gzip id \
+ indent infocmp jot ld locale m4 make mixerctl mkdep mtree \
+ nbperf netpgpkeys netpgpverify patch pkill pr printf pwhash \
+ realpath rump_server \
+ shmif_dumpbus shmif_pcapin sdiff sed sort stat \
+ tar tmux tr unifdef uniq vmstat xlint ztest
.if ${MKCXX} != "no"
TESTS_SUBDIRS+= c++
diff --git a/usr.bin/c++/t_call_once.sh b/usr.bin/c++/t_call_once.sh
index 28165b0fbd7e..13a705c57395 100644
--- a/usr.bin/c++/t_call_once.sh
+++ b/usr.bin/c++/t_call_once.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_call_once.sh,v 1.6 2022/06/12 15:08:38 skrll Exp $
+# $NetBSD: t_call_once.sh,v 1.7 2025/04/16 01:52:42 riastradh Exp $
#
# Copyright (c) 2018 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -101,6 +101,12 @@ EOF
}
call_once_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdio>
#include <thread>
@@ -128,6 +134,12 @@ call_once_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdio>
#include <thread>
@@ -207,6 +219,12 @@ EOF
}
call_once_pic_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdlib.h>
int callpic(void);
@@ -245,6 +263,12 @@ call_once_pic_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdlib.h>
int callpic(void);
diff --git a/usr.bin/c++/t_cxxruntime.sh b/usr.bin/c++/t_cxxruntime.sh
index 0ec35ad61f63..f3de8c171d19 100644
--- a/usr.bin/c++/t_cxxruntime.sh
+++ b/usr.bin/c++/t_cxxruntime.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_cxxruntime.sh,v 1.7 2022/06/12 15:08:38 skrll Exp $
+# $NetBSD: t_cxxruntime.sh,v 1.8 2025/04/16 01:52:42 riastradh Exp $
#
# Copyright (c) 2017 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -99,6 +99,12 @@ EOF
}
cxxruntime_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdlib>
#include <iostream>
@@ -121,6 +127,12 @@ cxxruntime_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdlib>
#include <iostream>
@@ -193,6 +205,12 @@ EOF
}
cxxruntime_pic_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdlib>
int callpic(void);
@@ -225,6 +243,12 @@ cxxruntime_pic_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdlib>
int callpic(void);
diff --git a/usr.bin/c++/t_hello.sh b/usr.bin/c++/t_hello.sh
index 7ac84eb4c558..42ac3c2b9818 100644
--- a/usr.bin/c++/t_hello.sh
+++ b/usr.bin/c++/t_hello.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_hello.sh,v 1.7 2022/06/12 15:08:38 skrll Exp $
+# $NetBSD: t_hello.sh,v 1.8 2025/04/16 01:52:42 riastradh Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -96,6 +96,12 @@ EOF
}
hello_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdio.h>
#include <stdlib.h>
@@ -117,6 +123,12 @@ hello_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdio.h>
#include <stdlib.h>
@@ -188,6 +200,12 @@ EOF
}
hello_pic_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdlib.h>
int callpic(void);
@@ -219,6 +237,12 @@ hello_pic_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdlib.h>
int callpic(void);
diff --git a/usr.bin/c++/t_pthread_once.sh b/usr.bin/c++/t_pthread_once.sh
index 7cfa945ec4a9..346345e688b6 100644
--- a/usr.bin/c++/t_pthread_once.sh
+++ b/usr.bin/c++/t_pthread_once.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_pthread_once.sh,v 1.6 2022/06/12 15:08:38 skrll Exp $
+# $NetBSD: t_pthread_once.sh,v 1.7 2025/04/16 01:52:42 riastradh Exp $
#
# Copyright (c) 2018 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -100,6 +100,12 @@ EOF
}
pthread_once_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdio>
#include <thread>
@@ -126,6 +132,12 @@ pthread_once_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <cstdio>
#include <thread>
@@ -202,6 +214,12 @@ EOF
}
pthread_once_pic_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdlib.h>
int callpic(void);
@@ -239,6 +257,12 @@ pthread_once_pic_profile_32_body() {
fi
fi
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.cpp << EOF
#include <stdlib.h>
int callpic(void);
diff --git a/usr.bin/c++/t_static_destructor.sh b/usr.bin/c++/t_static_destructor.sh
index 3e405e4cb5ff..ce675e0cd101 100644
--- a/usr.bin/c++/t_static_destructor.sh
+++ b/usr.bin/c++/t_static_destructor.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_static_destructor.sh,v 1.6 2022/06/12 15:08:38 skrll Exp $
+# $NetBSD: t_static_destructor.sh,v 1.11 2025/11/05 21:24:48 christos Exp $
#
# Copyright (c) 2017 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -28,6 +28,74 @@
# POSSIBILITY OF SUCH DAMAGE.
#
+mktest() {
+ cat > $@.cpp << EOF
+#include <iostream>
+struct A {
+ int i;
+ A(int i):i(i){std::cout << "CTOR A" << std::endl;}
+ ~A() {std::cout << "DTOR A:" << i << std::endl;}
+};
+struct B {
+ A *m_a;
+ B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
+ ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
+};
+int $@(void) {struct B b;return 0;}
+EOF
+}
+
+check() {
+ atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" $@
+}
+
+ccmain() {
+ atf_check -s exit:0 -o ignore -e ignore c++ $@ -o main main.cpp
+ check ./main
+}
+
+
+mkmain() {
+ cat > main.cpp << EOF
+#include <cstdlib>
+int $@(void);
+int main(void) {$@();exit(0);}
+EOF
+}
+
+cclib() {
+ atf_check -s exit:0 -o ignore -e ignore \
+ c++ "$@" -fPIC -shared -o libpic.so pic.cpp
+}
+
+check32() {
+ # check whether this arch is 64bit
+ if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
+ atf_skip "this is not a 64 bit architecture"
+ return 1
+ fi
+ if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
+ atf_skip "c++ -m32 not supported on this architecture"
+ return 1
+ else
+ if fgrep -q _LP64 ./def32; then
+ atf_fail "c++ -m32 does not generate netbsd32 binaries"
+ return 1
+ fi
+ fi
+ return 0
+}
+
+check59301() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ return 1
+ ;;
+ esac
+ return 0
+}
+
atf_test_case static_destructor
static_destructor_head() {
atf_set "descr" "compile and run \"hello world\""
@@ -89,236 +157,63 @@ static_destructor32_head() {
}
static_destructor_body() {
- cat > test.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int main(void) {struct B b;return 0;}
-EOF
- atf_check -s exit:0 -o ignore -e ignore c++ -o hello test.cpp
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ mktest main
+ ccmain
}
static_destructor_profile_body() {
- cat > test.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int main(void) {struct B b;return 0;}
-EOF
- atf_check -s exit:0 -o ignore -e ignore c++ -static -pg -o hello test.cpp
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ check59301 || return
+
+ mktest main
+ ccmain -static -pg
}
static_destructor_profile_32_body() {
- # check whether this arch is 64bit
- if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
- atf_skip "this is not a 64 bit architecture"
- fi
- if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
- atf_skip "c++ -m32 not supported on this architecture"
- else
- if fgrep -q _LP64 ./def32; then
- atf_fail "c++ -m32 does not generate netbsd32 binaries"
- fi
- fi
+ check32 || return
+ check59301 || return
- cat > test.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int main(void) {struct B b;return 0;}
-EOF
- atf_check -s exit:0 -o ignore -e ignore c++ -static -m32 -pg -o hello test.cpp
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ mktest main
+ ccmain -static -pg -m32
}
static_destructor_static_body() {
- cat > test.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int main(void) {struct B b;return 0;}
-EOF
- atf_check -s exit:0 -o ignore -e ignore c++ -static -o hello test.cpp
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ mktest main
+ ccmain -static
}
static_destructor_pic_body() {
- cat > test.cpp << EOF
-#include <cstdlib>
-int callpic(void);
-int main(void) {callpic();exit(0);}
-EOF
- cat > pic.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int callpic(void) {struct B b;}
-EOF
-
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -fPIC -shared -o libtest.so pic.cpp
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -o hello test.cpp -L. -ltest
-
- export LD_LIBRARY_PATH=.
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ mktest pic
+ mkmain pic
+ cclib
+ ccmain -L${PWD} -Wl,-R${PWD} -lpic
}
static_destructor_pic_32_body() {
- # check whether this arch is 64bit
- if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
- atf_skip "this is not a 64 bit architecture"
- fi
- if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
- atf_skip "c++ -m32 not supported on this architecture"
- else
- if fgrep -q _LP64 ./def32; then
- atf_fail "c++ -m32 does not generate netbsd32 binaries"
- fi
- fi
-
- cat > test.cpp << EOF
-#include <cstdlib>
-int callpic(void);
-int main(void) {callpic();exit(0);}
-EOF
- cat > pic.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int callpic(void) {struct B b;}
-EOF
-
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -m32 -fPIC -shared -o libtest.so pic.cpp
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -m32 -o hello test.cpp -L. -ltest
-
- export LD_LIBRARY_PATH=.
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ check32 || return
+ mktest pic
+ mkmain pic
+ cclib -m32
+ ccmain -m32 -L${PWD} -Wl,-R${PWD} -lpic
}
static_destructor_pic_profile_body() {
- cat > test.cpp << EOF
-#include <cstdlib>
-int callpic(void);
-int main(void) {callpic();exit(0);}
-EOF
- cat > pic.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int callpic(void) {struct B b;}
-EOF
+ check59301 || return
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -pg -fPIC -shared -o libtest.so pic.cpp
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -pg -o hello test.cpp -L. -ltest
-
- export LD_LIBRARY_PATH=.
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ mktest pic
+ mkmain pic
+ cclib -pg
+ ccmain -pg -L${PWD} -Wl,-R${PWD} -lpic
}
static_destructor_pic_profile_32_body() {
- # check whether this arch is 64bit
- if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
- atf_skip "this is not a 64 bit architecture"
- fi
- if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
- atf_skip "c++ -m32 not supported on this architecture"
- else
- if fgrep -q _LP64 ./def32; then
- atf_fail "c++ -m32 does not generate netbsd32 binaries"
- fi
- fi
+ check32 || return
+ check59301 || return
- cat > test.cpp << EOF
-#include <cstdlib>
-int callpic(void);
-int main(void) {callpic();exit(0);}
-EOF
- cat > pic.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int callpic(void) {struct B b;}
-EOF
-
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -m32 -pg -fPIC -shared -o libtest.so pic.cpp
- atf_check -s exit:0 -o ignore -e ignore \
- c++ -m32 -pg -o hello test.cpp -L. -ltest
-
- export LD_LIBRARY_PATH=.
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ mktest pic
+ mkmain pic
+ cclib -m32 -pg
+ ccmain -m32 -pg -L${PWD} -Wl,-R${PWD} -lpic
}
static_destructor_pie_body() {
@@ -326,53 +221,16 @@ static_destructor_pie_body() {
if ! c++ -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then
atf_skip "c++ -pie not supported on this architecture"
fi
- cat > test.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int main(void) {struct B b;return 0;}
-EOF
- atf_check -s exit:0 -o ignore -e ignore c++ -fpie -pie -o hello test.cpp
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ mktest main
+ ccmain -fpie -pie
}
static_destructor32_body() {
- # check whether this arch is 64bit
- if ! c++ -dM -E - < /dev/null | fgrep -q _LP64; then
- atf_skip "this is not a 64 bit architecture"
- fi
- if ! c++ -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
- atf_skip "c++ -m32 not supported on this architecture"
- else
- if fgrep -q _LP64 ./def32; then
- atf_fail "c++ -m32 does not generate netbsd32 binaries"
- fi
- fi
+ check32 || return
- cat > test.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int main(void) {struct B b;return 0;}
-EOF
- atf_check -s exit:0 -o ignore -e ignore c++ -o hello32 -m32 test.cpp
- atf_check -s exit:0 -o ignore -e ignore c++ -o hello64 test.cpp
+ mktest main
+ atf_check -s exit:0 -o ignore -e ignore c++ -o hello32 -m32 main.cpp
+ atf_check -s exit:0 -o ignore -e ignore c++ -o hello64 main.cpp
file -b ./hello32 > ./ftype32
file -b ./hello64 > ./ftype64
if diff ./ftype32 ./ftype64 >/dev/null; then
@@ -382,26 +240,10 @@ EOF
cat ./ftype32
echo "While native (64bit) binaries are:"
cat ./ftype64
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello32
-
- # do another test with static 32bit binaries
- cat > test.cpp << EOF
-#include <iostream>
-struct A {
- int i;
- A(int i):i(i){std::cout << "CTOR A" << std::endl;}
- ~A() {std::cout << "DTOR A:" << i << std::endl;}
-};
-struct B {
- A *m_a;
- B(){static A s_a(10);m_a=&s_a;std::cout << "CTOR B" << std::endl;}
- ~B(){std::cout << "DTOR B:" << (*m_a).i << std::endl;(*m_a).i = 20;}
-};
-int main(void) {struct B b;return 0;}
-EOF
+ check ./hello32
atf_check -s exit:0 -o ignore -e ignore c++ -o hello -m32 \
- -static test.cpp
- atf_check -s exit:0 -o inline:"CTOR A\nCTOR B\nDTOR B:10\nDTOR A:20\n" ./hello
+ -static main.cpp
+ check ./hello
}
atf_init_test_cases()
diff --git a/usr.bin/cc/Makefile b/usr.bin/cc/Makefile
index 6755a0ed632b..1d65ff459550 100644
--- a/usr.bin/cc/Makefile
+++ b/usr.bin/cc/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.8 2019/08/18 20:15:58 kamil Exp $
+# $NetBSD: Makefile,v 1.11 2026/01/27 20:01:47 mrg Exp $
.include <bsd.own.mk>
@@ -22,8 +22,12 @@ UBSAN_TESTS+= t_ubsan_int_divzero
TESTS_SH= #
TESTS_SH+= $(ASAN_TESTS)
TESTS_SH+= $(UBSAN_TESTS)
+
+TESTS_SH+= t_ctype_abuse
TESTS_SH+= t_hello
TESTS_SH+= t_libgomp
+TESTS_SH+= t_libm_cabs
+TESTS_SH+= t_pthread_abuse
TESTS_SH+= t_fuzzer_oom
TESTS_SH+= t_fuzzer_simple
diff --git a/usr.bin/cc/t_hello.sh b/usr.bin/cc/t_hello.sh
index ad6d0eab4700..79aacfc63567 100644
--- a/usr.bin/cc/t_hello.sh
+++ b/usr.bin/cc/t_hello.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_hello.sh,v 1.12 2022/06/12 15:08:38 skrll Exp $
+# $NetBSD: t_hello.sh,v 1.13 2025/04/16 01:52:42 riastradh Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -66,6 +66,12 @@ EOF
}
hello_profile_body() {
+ case `uname -m` in
+ riscv) atf_expect_fail "PR port-riscv/59301:" \
+ " riscv: missing MKPROFILE=yes support"
+ ;;
+ esac
+
cat > test.c << EOF
#include <stdio.h>
#include <stdlib.h>
diff --git a/usr.bin/config/t_config.sh b/usr.bin/config/t_config.sh
index 3d9c86e72681..0cf066845ec3 100644
--- a/usr.bin/config/t_config.sh
+++ b/usr.bin/config/t_config.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_config.sh,v 1.11 2021/10/21 13:21:55 andvar Exp $
+# $NetBSD: t_config.sh,v 1.12 2024/04/28 07:27:42 rillig Exp $
#
# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -68,7 +68,7 @@ run_and_check_pass()
run_and_check_prep "${name}"
- atf_check -o ignore -s eq:0 \
+ atf_check -o ignore -s exit:0 \
config -s "${supportdir}" -b "compile/${name}" "${config}"
}
@@ -80,7 +80,7 @@ run_and_check_warn()
local stderr
eval stderr=\$${name}_stderr
- atf_check -o ignore -e "${stderr}" -s eq:0 \
+ atf_check -o ignore -e "${stderr}" -s exit:0 \
config -s "${supportdir}" -b "compile/${name}" "${config}"
}
diff --git a/usr.bin/cpio/Makefile b/usr.bin/cpio/Makefile
index 4e3f3ca2c516..5bb2b5a77968 100644
--- a/usr.bin/cpio/Makefile
+++ b/usr.bin/cpio/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.4 2020/01/19 17:36:57 christos Exp $
+# $NetBSD: Makefile,v 1.6 2026/01/30 19:03:37 jakllsch Exp $
NOMAN=
@@ -27,7 +27,7 @@ SRCS.h_cpio= \
test_main.c \
test_utils.c \
cmdline.c \
-err.c \
+lafe_err.c \
test_0.c \
test_basic.c \
test_cmdline.c \
@@ -112,3 +112,5 @@ CLEANFILES+=list.h
list.h: ${SRCS.h_cpio} Makefile
${TOOL_GREP} -h '^DEFINE_TEST(' ${.ALLSRC} > ${.TARGET}
+
+COPTS.test_main.c+= ${CC_WNO_STRINGOP_OVERFLOW}
diff --git a/usr.bin/cut/t_cut.sh b/usr.bin/cut/t_cut.sh
index 3c3793f84f28..307585a76fad 100644
--- a/usr.bin/cut/t_cut.sh
+++ b/usr.bin/cut/t_cut.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_cut.sh,v 1.1 2012/03/17 16:33:13 jruoho Exp $
+# $NetBSD: t_cut.sh,v 1.6 2025/03/04 03:55:39 gutteridge Exp $
#
# Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -90,7 +90,7 @@ dsflag_body()
atf_test_case latin1
latin1_head()
{
- atf_set "descr" "Checks support for non-ascii characters"
+ atf_set "descr" "Checks support for non-ASCII characters"
}
latin1_body()
{
@@ -119,6 +119,20 @@ utf8_body()
cut -c 6,7,8 "$(atf_get_srcdir)/d_utf8.in"
}
+atf_test_case nflag
+nflag_head()
+{
+ atf_set "descr" "Checks -n flag (PR bin/59029)"
+}
+
+nflag_body()
+{
+ export LC_ALL=en_US.UTF-8
+
+ atf_check -o inline:$'\xC3\x84:b\n\xC3\x84:B\n\xC3\x84:B\n\xC3\x84:B\n' \
+ cut -b 5,6,7 -n "$(atf_get_srcdir)/d_utf8.in"
+}
+
atf_init_test_cases()
{
atf_add_test_case basic
@@ -127,4 +141,5 @@ atf_init_test_cases()
atf_add_test_case dsflag
atf_add_test_case latin1
atf_add_test_case utf8
+ atf_add_test_case nflag
}
diff --git a/usr.bin/diff/Makefile b/usr.bin/diff/Makefile
index 2bd8339a0d82..b1340e8c944b 100644
--- a/usr.bin/diff/Makefile
+++ b/usr.bin/diff/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.1 2011/05/03 15:13:50 jruoho Exp $
+# $NetBSD: Makefile,v 1.2 2025/11/28 23:50:33 nia Exp $
.include <bsd.own.mk>
@@ -9,5 +9,24 @@ TESTS_SH= t_diff
FILESDIR= ${TESTSDIR}
FILES+= d_mallocv1.in
FILES+= d_mallocv2.in
+FILES+= functionname.in
+FILES+= functionname_c.in
+FILES+= input1.in
+FILES+= input2.in
+FILES+= input_c1.in
+FILES+= input_c2.in
+FILES+= functionname_c.out
+FILES+= header.out
+FILES+= header_ns.out
+FILES+= simple.out
+FILES+= simple_b.out
+FILES+= simple_e.out
+FILES+= simple_i.out
+FILES+= simple_n.out
+FILES+= simple_p.out
+FILES+= simple_u.out
+FILES+= simple_w.out
+FILES+= unified_9999.out
+FILES+= unified_p.out
.include <bsd.test.mk>
diff --git a/usr.bin/diff/t_diff.sh b/usr.bin/diff/t_diff.sh
index e33edeeb3c60..8b5a53c0453b 100644
--- a/usr.bin/diff/t_diff.sh
+++ b/usr.bin/diff/t_diff.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_diff.sh,v 1.3 2012/03/13 05:40:00 jruoho Exp $
+# $NetBSD: t_diff.sh,v 1.5 2025/12/20 00:49:43 nia Exp $
#
# Copyright (c) 2011 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -68,8 +68,111 @@ same_body() {
-x "diff $(atf_get_srcdir)/t_diff $(atf_get_srcdir)/t_diff"
}
+atf_test_case simple
+simple_head() {
+ atf_set "descr" "Test diff(1) with simple diffs"
+}
+
+simple_body()
+{
+ atf_check -o file:$(atf_get_srcdir)/simple.out -s eq:1 \
+ diff "$(atf_get_srcdir)/input1.in" "$(atf_get_srcdir)/input2.in"
+
+ atf_check -o file:$(atf_get_srcdir)/simple_e.out -s eq:1 \
+ diff -e "$(atf_get_srcdir)/input1.in" "$(atf_get_srcdir)/input2.in"
+
+ atf_check -o file:$(atf_get_srcdir)/simple_u.out -s eq:1 \
+ diff -u -L input1 -L input2 "$(atf_get_srcdir)/input1.in" "$(atf_get_srcdir)/input2.in"
+
+ atf_check -o file:$(atf_get_srcdir)/simple_n.out -s eq:1 \
+ diff -n "$(atf_get_srcdir)/input1.in" "$(atf_get_srcdir)/input2.in"
+
+ atf_check -o inline:"Files $(atf_get_srcdir)/input1.in and $(atf_get_srcdir)/input2.in differ\n" -s eq:1 \
+ diff -q "$(atf_get_srcdir)/input1.in" "$(atf_get_srcdir)/input2.in"
+
+ atf_check \
+ diff -q "$(atf_get_srcdir)/input1.in" "$(atf_get_srcdir)/input1.in"
+
+ atf_check \
+ diff -q -U 2 -p "$(atf_get_srcdir)/input1.in" "$(atf_get_srcdir)/input1.in"
+
+ atf_check -o file:$(atf_get_srcdir)/simple_i.out -s eq:1 \
+ diff -i "$(atf_get_srcdir)/input_c1.in" "$(atf_get_srcdir)/input_c2.in"
+
+ atf_check -o file:$(atf_get_srcdir)/simple_w.out -s eq:1 \
+ diff -w "$(atf_get_srcdir)/input_c1.in" "$(atf_get_srcdir)/input_c2.in"
+
+ atf_check -o file:$(atf_get_srcdir)/simple_b.out -s eq:1 \
+ diff -b "$(atf_get_srcdir)/input_c1.in" "$(atf_get_srcdir)/input_c2.in"
+
+ atf_check -o file:$(atf_get_srcdir)/simple_p.out -s eq:1 \
+ diff --label input_c1.in --label input_c2.in -p "$(atf_get_srcdir)/input_c1.in" "$(atf_get_srcdir)/input_c2.in"
+}
+
+atf_test_case unified
+unified_head() {
+ atf_set "descr" "Test diff(1) with unified diffs"
+}
+
+unified_body()
+{
+ atf_check -o file:$(atf_get_srcdir)/unified_p.out -s eq:1 \
+ diff -up -L input_c1.in -L input_c2.in "$(atf_get_srcdir)/input_c1.in" "$(atf_get_srcdir)/input_c2.in"
+ atf_check -o file:$(atf_get_srcdir)/unified_9999.out -s eq:1 \
+ diff -U 9999 -L input_c1.in -L input_c2.in "$(atf_get_srcdir)/input_c1.in" "$(atf_get_srcdir)/input_c2.in"
+}
+
+atf_test_case header
+header_head() {
+ atf_set "descr" "Test diff(1) modification time headers"
+}
+
+header_body()
+{
+ export TZ=UTC
+ : > empty
+ echo hello > hello
+ touch -d 2015-04-03T01:02:03 empty
+ touch -d 2016-12-22T11:22:33 hello
+ atf_check -o "file:$(atf_get_srcdir)/header.out" -s eq:1 \
+ diff -u empty hello
+}
+
+atf_test_case header_ns
+header_ns_head() {
+ atf_set "descr" "Test diff(1) modification time headers with nanoseconds"
+}
+
+header_ns_body()
+{
+ export TZ=UTC
+ : > empty
+ echo hello > hello
+ touch -d 2015-04-03T01:02:03.123456789 empty
+ touch -d 2016-12-22T11:22:33.987654321 hello
+ atf_check -o "file:$(atf_get_srcdir)/header_ns.out" -s eq:1 \
+ diff -u empty hello
+}
+
+atf_test_case functionname
+functionname_head() {
+ atf_set "descr" "Test diff(1) C function option (-p)"
+}
+
+functionname_body()
+{
+ atf_check -o file:$(atf_get_srcdir)/functionname_c.out -s exit:1 \
+ diff -u -p -L functionname.in -L functionname_c.in \
+ "$(atf_get_srcdir)/functionname.in" "$(atf_get_srcdir)/functionname_c.in"
+}
+
atf_init_test_cases() {
atf_add_test_case mallocv
atf_add_test_case nomallocv
atf_add_test_case same
+ atf_add_test_case simple
+ atf_add_test_case unified
+ atf_add_test_case header
+ atf_add_test_case header_ns
+ atf_add_test_case functionname
}
diff --git a/usr.bin/grep/t_grep.sh b/usr.bin/grep/t_grep.sh
index dc6a6d537c8b..3b9d9f65f68b 100644
--- a/usr.bin/grep/t_grep.sh
+++ b/usr.bin/grep/t_grep.sh
@@ -1,6 +1,6 @@
-# $NetBSD: t_grep.sh,v 1.7 2022/09/09 22:14:29 wiz Exp $
+# $NetBSD: t_grep.sh,v 1.8 2024/11/23 09:38:02 rillig Exp $
#
-# Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
+# Copyright (c) 2008, 2009, 2021, 2024 The NetBSD Foundation, Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -341,6 +341,24 @@ context2_body()
grep -z -C1 cod test1 test2
}
+atf_test_case pr_58849
+pr_58849_head()
+{
+ atf_set "descr" "Checks overlapping patterns in whole-line search"
+}
+pr_58849_body()
+{
+ printf '%s\n' __bss_start__ __bss_end__ hello > input
+
+ # The line '__bss_end__' must not occur in the output.
+ atf_check -o inline:'__bss_start__\nhello\n' \
+ grep -Fvx -e _end -e __bss_end__ input
+
+ # Listing the most specific pattern first works around PR bin/58849.
+ atf_check -o inline:'__bss_start__\nhello\n' \
+ grep -Fvx -e __bss_end__ -e _end input
+}
+
atf_init_test_cases()
{
atf_add_test_case basic
@@ -363,4 +381,5 @@ atf_init_test_cases()
atf_add_test_case zgrep
atf_add_test_case nonexistent
atf_add_test_case context2
+ atf_add_test_case pr_58849
}
diff --git a/usr.bin/gzip/t_gzip.sh b/usr.bin/gzip/t_gzip.sh
index bee6655758c8..7094862dfb54 100644
--- a/usr.bin/gzip/t_gzip.sh
+++ b/usr.bin/gzip/t_gzip.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_gzip.sh,v 1.1 2012/03/17 16:33:13 jruoho Exp $
+# $NetBSD: t_gzip.sh,v 1.5 2026/01/10 05:11:23 mrg Exp $
#
# Copyright (c) 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -100,6 +100,118 @@ EOF
atf_check gzip -d good.gz
}
+atf_test_case lzip
+lzip_head()
+{
+ atf_set "descr" "Checks lzip compression levels (PR/58223)"
+ atf_set "require.progs" "lzip"
+}
+lzip_body()
+{
+ n=net_tests.tar
+ tar -C /usr/tests/net -cf $n .
+ for i in $(jot 10 0 9); do
+ f=$n.$i.lz
+ lzip -$ic < $n > $f
+ gunzip -t $f > /dev/null
+ done
+}
+
+atf_test_case unbzip2
+unbzip2_head()
+{
+ atf_set "descr" "Test bzip2 decompression"
+}
+
+unbzip2_body()
+{
+ cat >testbzip2.txt.bz2.uue <<EOF
+begin-base64 664 testbzip2.txt.bz2
+QlpoOTFBWSZTWRkTvvsAAARbgAAQQAAQAAQAP2bcECAAMUwmmgNMQiMg9QGmIGw9
+kDXEgtnxXXYTzQ5wplvpTEfF3JFOFCQGRO++wA==
+====
+EOF
+ uudecode -m testbzip2.txt.bz2.uue
+ atf_check gzip -d testbzip2.txt.bz2
+}
+
+atf_test_case unlz
+unlz_head()
+{
+ atf_set "descr" "Test lzip decompression"
+}
+
+unlz_body()
+{
+ cat >testlzip2.txt.lz.uue <<EOF
+begin-base64 664 testlzip.txt.lz
+TFpJUAEMACoaCSdkHIeKT8pM9PgdK8W6hMTdH5N/yGpYYx/txcwX2b2V8RX3n//0
+/3gA5C0yJCQAAAAAAAAARwAAAAAAAAA=
+====
+EOF
+ uudecode -m testlzip2.txt.lz.uue
+ atf_check gzip -d testlzip.txt.lz
+}
+
+atf_test_case unpack
+unpack_head()
+{
+ atf_set "descr" "Test pack decompression"
+}
+
+unpack_body()
+{
+ cat >testpack.txt.z.uue <<EOF
+begin-base64 664 testpack.txt.z
+Hx4AAAIlCQACAwAAAwQIBm5vIGdsCmVzaXBydCcuYWJjZGhtSVRma3V3eACFBhyG
+HIMRIw4khGFhxAw44wSQ4MEAMgIMxgUUACQQcjAYSIBi+RxIUMIAoYcYhhJCcYeB
+BJGgkgQOQcYNIhGFhxAw44YHYwKK+XIvlyL5ci+XIvlyL5ci+XIvlyFfLkXy5F8u
+RfLkXy5F8uRfLkXy5CvlyL5ci+XIvlyL5ci+XIvlyL5chXy5F8uRfLkXy5F8uRfL
+kXy5F8uQr5ci+XIvlyL5ci+XIvlyL5ci+XIV8uRfLkXy5F8uRfLkXy5F8uRfLkK+
+XIvlyL5ci+XIvlyL5ci+XIvlyFA4
+====
+EOF
+ uudecode -m testpack.txt.z.uue
+ atf_check gzip -d testpack.txt.z
+}
+
+atf_test_case unxz
+unxz_head()
+{
+ atf_set "descr" "Test xz decompression"
+}
+
+unxz_body()
+{
+ cat >testxz.txt.xz.uue <<EOF
+====
+begin-base64 664 testxz.txt.xz
+/Td6WFoAAATm1rRGAgAhARYAAAB0L+WjAQAhVGhpcyBpcyBhIHRlc3QgY29tcHJl
+c3NlZCB4eiBmaWxlCgAAAPXae+PtU7eLAAE6IrYqT9AftvN9AQAAAAAEWVo=
+====
+EOF
+ uudecode -m testxz.txt.xz.uue
+ atf_check gzip -d testxz.txt.xz
+}
+
+atf_test_case ungzip
+ungzip_head()
+{
+ atf_set "descr" "Test gzip decompression"
+}
+
+ungzip_body()
+{
+ cat >testgzip.txt.gz.uue <<EOF
+begin-base64 664 testgzip.txt.gz
+H4sICInRYWkAA3Rlc3QtZ3ppcC50eHQAC8nILFYAokSFktTiEoXk/NyCotTi4tQU
+hfSqzAKFtMycVC4AE9bS3CQAAAA=
+====
+EOF
+ uudecode -m testgzip.txt.gz.uue
+ atf_check gzip -d testgzip.txt.gz
+}
+
atf_init_test_cases()
{
atf_add_test_case concatenated
@@ -107,4 +219,10 @@ atf_init_test_cases()
atf_add_test_case truncated
atf_add_test_case crcerror
atf_add_test_case good
+ atf_add_test_case lzip
+ atf_add_test_case unbzip2
+ atf_add_test_case unlz
+ atf_add_test_case unpack
+ atf_add_test_case unxz
+ atf_add_test_case ungzip
}
diff --git a/usr.bin/id/t_groups.sh b/usr.bin/id/t_groups.sh
index 71121ab38e32..c345fd1d39fc 100644
--- a/usr.bin/id/t_groups.sh
+++ b/usr.bin/id/t_groups.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_groups.sh,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+# $NetBSD: t_groups.sh,v 1.2 2024/04/28 07:27:42 rillig Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -42,13 +42,13 @@ correct_body() {
create_run_groups
echo "users wheel" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_groups.sh
- atf_check -s eq:0 -o file:expout -e empty ./run_groups.sh 100
- atf_check -s eq:0 -o file:expout -e empty ./run_groups.sh test
+ atf_check -s exit:0 -o file:expout -e empty ./run_groups.sh
+ atf_check -s exit:0 -o file:expout -e empty ./run_groups.sh 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_groups.sh test
echo "wheel" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_groups.sh 0
- atf_check -s eq:0 -o file:expout -e empty ./run_groups.sh root
+ atf_check -s exit:0 -o file:expout -e empty ./run_groups.sh 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_groups.sh root
}
atf_test_case syntax
@@ -60,8 +60,8 @@ syntax_body() {
# Give an invalid flag but which is allowed by id (with which
# groups shares code) when using the -Gn options.
- atf_check -s eq:1 -o empty -e save:stderr ./run_groups.sh -r
- atf_check -s eq:0 -o ignore -e empty grep '^usage:' stderr
+ atf_check -s exit:1 -o empty -e save:stderr ./run_groups.sh -r
+ atf_check -s exit:0 -o ignore -e empty grep '^usage:' stderr
}
atf_init_test_cases()
diff --git a/usr.bin/id/t_id.sh b/usr.bin/id/t_id.sh
index 9c877a6db7cf..dff902030e17 100644
--- a/usr.bin/id/t_id.sh
+++ b/usr.bin/id/t_id.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_id.sh,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+# $NetBSD: t_id.sh,v 1.2 2024/04/28 07:27:42 rillig Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -42,24 +42,24 @@ default_body() {
create_run_id
echo "uid=100(test) gid=100(users) groups=100(users),0(wheel)" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh test
echo "uid=0(root) gid=0(wheel) groups=0(wheel)" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh root
export LIBFAKE_EGID_ROOT=1 LIBFAKE_EUID_ROOT=1
echo "uid=100(test) gid=100(users) euid=0(root) egid=0(wheel) groups=100(users),0(wheel)" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh
unset LIBFAKE_EGID_ROOT LIBFAKE_EUID_ROOT
echo 'id: nonexistent: No such user' >experr
- atf_check -s eq:1 -o empty -e file:experr ./run_id.sh nonexistent
+ atf_check -s exit:1 -o empty -e file:experr ./run_id.sh nonexistent
- atf_check -s eq:1 -o empty -e save:stderr ./run_id.sh root nonexistent
- atf_check -s eq:0 -o ignore -e empty grep ^usage: stderr
+ atf_check -s exit:1 -o empty -e save:stderr ./run_id.sh root nonexistent
+ atf_check -s exit:0 -o ignore -e empty grep ^usage: stderr
}
atf_test_case primaries
@@ -73,9 +73,9 @@ primaries_body() {
for p1 in -G -g -p -u; do
for p2 in -G -g -p -u; do
if [ ${p1} != ${p2} ]; then
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
./run_id.sh ${p1} ${p2}
- atf_check -s eq:0 -o ignore -e empty \
+ atf_check -s exit:0 -o ignore -e empty \
grep ^usage: stderr
fi
done
@@ -90,28 +90,28 @@ Gflag_body() {
create_run_id
echo "100 0" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G test
echo "users wheel" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G -n
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G -n 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G -n test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G -n 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G -n test
echo "0" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G root
echo "wheel" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G -n 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -G -n root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G -n 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -G -n root
echo 'id: nonexistent: No such user' >experr
- atf_check -s eq:1 -o empty -e file:experr ./run_id.sh -G nonexistent
+ atf_check -s exit:1 -o empty -e file:experr ./run_id.sh -G nonexistent
- atf_check -s eq:1 -o empty -e save:stderr ./run_id.sh -G root nonexistent
- atf_check -s eq:0 -o ignore -e empty grep ^usage: stderr
+ atf_check -s exit:1 -o empty -e save:stderr ./run_id.sh -G root nonexistent
+ atf_check -s exit:0 -o ignore -e empty grep ^usage: stderr
}
atf_test_case gflag
@@ -122,66 +122,66 @@ gflag_body() {
create_run_id
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g test
echo "users" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -n
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -n 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -n test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -n 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -n test
echo "0" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g root
echo "wheel" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -n 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -n root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -n 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -n root
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r
echo "users" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r -n
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r test
echo "users" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r -n 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r -n test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r -n 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r -n test
export LIBFAKE_EGID_ROOT=1 LIBFAKE_EUID_ROOT=1
echo "0" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g
echo "wheel" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -n
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r
echo "users" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r -n
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r test
echo "users" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r -n 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -g -r -n test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r -n 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -g -r -n test
unset LIBFAKE_EGID_ROOT LIBFAKE_EUID_ROOT
echo 'id: nonexistent: No such user' >experr
- atf_check -s eq:1 -o empty -e file:experr ./run_id.sh -g nonexistent
+ atf_check -s exit:1 -o empty -e file:experr ./run_id.sh -g nonexistent
- atf_check -s eq:1 -o empty -e save:stderr ./run_id.sh -g root nonexistent
- atf_check -s eq:0 -o ignore -e empty grep ^usage: stderr
+ atf_check -s exit:1 -o empty -e save:stderr ./run_id.sh -g root nonexistent
+ atf_check -s exit:0 -o ignore -e empty grep ^usage: stderr
}
atf_test_case pflag
@@ -195,16 +195,16 @@ pflag_body() {
uid test
groups users wheel
EOF
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -p
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -p 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -p test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -p
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -p 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -p test
cat >expout <<EOF
uid root
groups wheel
EOF
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -p 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -p root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -p 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -p root
export LIBFAKE_EGID_ROOT=1 LIBFAKE_EUID_ROOT=1
cat >expout <<EOF
@@ -213,14 +213,14 @@ euid root
rgid users
groups users wheel
EOF
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -p
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -p
unset LIBFAKE_EGID_ROOT LIBFAKE_EUID_ROOT
echo 'id: nonexistent: No such user' >experr
- atf_check -s eq:1 -o empty -e file:experr ./run_id.sh -p nonexistent
+ atf_check -s exit:1 -o empty -e file:experr ./run_id.sh -p nonexistent
- atf_check -s eq:1 -o empty -e save:stderr ./run_id.sh -p root nonexistent
- atf_check -s eq:0 -o ignore -e empty grep ^usage: stderr
+ atf_check -s exit:1 -o empty -e save:stderr ./run_id.sh -p root nonexistent
+ atf_check -s exit:0 -o ignore -e empty grep ^usage: stderr
}
atf_test_case uflag
@@ -231,67 +231,67 @@ uflag_body() {
create_run_id
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u test
echo "test" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -n
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -n 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -n test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -n 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -n test
echo "0" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u root
echo "root" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -n 0
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -n root
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -n 0
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -n root
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r
echo "test" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r -n
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r test
echo "test" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r -n 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r -n test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r -n 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r -n test
export LIBFAKE_EGID_ROOT=1 LIBFAKE_EUID_ROOT=1
echo "0" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u
echo "root" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -n
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r
echo "test" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r -n
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r -n
echo "100" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r test
echo "test" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r -n 100
- atf_check -s eq:0 -o file:expout -e empty ./run_id.sh -u -r -n test
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r -n 100
+ atf_check -s exit:0 -o file:expout -e empty ./run_id.sh -u -r -n test
unset LIBFAKE_EGID_ROOT LIBFAKE_EUID_ROOT
echo 'id: nonexistent: No such user' >experr
- atf_check -s eq:1 -o empty -e file:experr ./run_id.sh -u nonexistent
+ atf_check -s exit:1 -o empty -e file:experr ./run_id.sh -u nonexistent
- atf_check -s eq:1 -o empty -e save:stderr \
+ atf_check -s exit:1 -o empty -e save:stderr \
./run_id.sh -u root nonexistent
- atf_check -s eq:0 -o ignore -e empty grep ^usage: stderr
+ atf_check -s exit:0 -o ignore -e empty grep ^usage: stderr
}
atf_init_test_cases()
diff --git a/usr.bin/id/t_whoami.sh b/usr.bin/id/t_whoami.sh
index c8df7452e5ca..8729118c7395 100644
--- a/usr.bin/id/t_whoami.sh
+++ b/usr.bin/id/t_whoami.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_whoami.sh,v 1.1 2012/03/17 16:33:14 jruoho Exp $
+# $NetBSD: t_whoami.sh,v 1.2 2024/04/28 07:27:42 rillig Exp $
#
# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -43,12 +43,12 @@ correct_body() {
echo "Checking with EUID=100"
echo "test" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_whoami.sh
+ atf_check -s exit:0 -o file:expout -e empty ./run_whoami.sh
echo "Checking with EUID=0"
export LIBFAKE_EUID_ROOT=1
echo "root" >expout
- atf_check -s eq:0 -o file:expout -e empty ./run_whoami.sh
+ atf_check -s exit:0 -o file:expout -e empty ./run_whoami.sh
}
atf_test_case syntax
@@ -60,12 +60,12 @@ syntax_body() {
# Give a user to the command.
echo 'usage: whoami' >experr
- atf_check -s eq:1 -o empty -e file:experr ./run_whoami.sh root
+ atf_check -s exit:1 -o empty -e file:experr ./run_whoami.sh root
# Give an invalid flag but which is allowed by id (with which
# whoami shares code) when using the -un options.
echo 'usage: whoami' >experr
- atf_check -s eq:1 -o empty -e file:experr ./run_whoami.sh -r
+ atf_check -s exit:1 -o empty -e file:experr ./run_whoami.sh -r
}
atf_init_test_cases()
diff --git a/usr.bin/indent/fmt_expr.c b/usr.bin/indent/fmt_expr.c
index d23ebee785ad..66faf05478b0 100644
--- a/usr.bin/indent/fmt_expr.c
+++ b/usr.bin/indent/fmt_expr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: fmt_expr.c,v 1.10 2023/06/16 23:19:01 rillig Exp $ */
+/* $NetBSD: fmt_expr.c,v 1.11 2023/12/03 14:26:10 rillig Exp $ */
/*
* Tests for all kinds of expressions that are not directly related to unary
@@ -57,3 +57,28 @@
// error: Standard Input:7: Unbalanced parentheses
// warning: Standard Input:9: Extra ')'
//indent end
+
+
+// A compound expression with an unknown type is indented other than one with
+// a known type. Ideally, both cases should be treated the same.
+//indent input
+{
+ var = (type) { .member = value };
+ var = (type) { value, value, value };
+ var = (struct s) { .member = value };
+ var = (struct s) { value, value, value };
+}
+//indent end
+
+//indent run
+{
+ var = (type) {
+ .member = value
+ };
+ var = (type) {
+ value, value, value
+ };
+ var = (struct s){.member = value};
+ var = (struct s){value, value, value};
+}
+//indent end
diff --git a/usr.bin/indent/lsym_comment.c b/usr.bin/indent/lsym_comment.c
index a2b744d60844..23970904d942 100644
--- a/usr.bin/indent/lsym_comment.c
+++ b/usr.bin/indent/lsym_comment.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_comment.c,v 1.24 2023/06/23 20:59:04 rillig Exp $ */
+/* $NetBSD: lsym_comment.c,v 1.25 2025/01/03 23:37:18 rillig Exp $ */
/*
* Tests for the token lsym_comment, which starts a comment.
@@ -761,7 +761,8 @@ while(cond)/*comment*/;
void
loop(void)
{
- while (cond) /* comment */;
+ while (cond) /* comment */
+ ;
while (cond)
/* comment */;
diff --git a/usr.bin/indent/lsym_lparen_or_lbracket.c b/usr.bin/indent/lsym_lparen_or_lbracket.c
index 5efef753e09d..ea93a050833c 100644
--- a/usr.bin/indent/lsym_lparen_or_lbracket.c
+++ b/usr.bin/indent/lsym_lparen_or_lbracket.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_lparen_or_lbracket.c,v 1.19 2023/06/17 22:09:24 rillig Exp $ */
+/* $NetBSD: lsym_lparen_or_lbracket.c,v 1.20 2025/01/03 23:37:18 rillig Exp $ */
/*
* Tests for the token lsym_lparen_or_lbracket, which represents a '(' or '['
@@ -316,11 +316,13 @@ cover_want_blank_before_lparen(void)
#define preprocessing
(preprocessing)();
(lsym_form_feed)();
- for (;;);
+ for (;;)
+ ;
do
(lsym_do) = 3;
while (0);
- if (cond);
+ if (cond)
+ ;
else
(lsym_else)();
do
diff --git a/usr.bin/indent/lsym_rbrace.c b/usr.bin/indent/lsym_rbrace.c
index c01dbc972671..ada5574d304a 100644
--- a/usr.bin/indent/lsym_rbrace.c
+++ b/usr.bin/indent/lsym_rbrace.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_rbrace.c,v 1.7 2023/06/08 06:47:14 rillig Exp $ */
+/* $NetBSD: lsym_rbrace.c,v 1.8 2025/01/04 21:54:26 rillig Exp $ */
/*
* Tests for the token lsym_rbrace, which represents a '}' in these contexts:
@@ -90,9 +90,8 @@ int numbers[][] = {{11},
{31},
};
int numbers[][] = {{11},
- // $ FIXME: Must be indented.
- {21},
- {31},
+ {21},
+ {31},
};
}
//indent end
diff --git a/usr.bin/indent/lsym_unary_op.c b/usr.bin/indent/lsym_unary_op.c
index e6ff89453c59..d403b24146a8 100644
--- a/usr.bin/indent/lsym_unary_op.c
+++ b/usr.bin/indent/lsym_unary_op.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_unary_op.c,v 1.12 2023/06/17 22:09:24 rillig Exp $ */
+/* $NetBSD: lsym_unary_op.c,v 1.13 2023/10/22 21:03:08 rillig Exp $ */
/*
* Tests for the token lsym_unary_op, which represents a unary operator.
@@ -50,8 +50,8 @@ int same = + + + + +- - - - -3;
/*
- * A special kind of unary operator is '->', which additionally suppresses the
- * next space.
+ * The operator '->' is special as it additionally suppresses the space between
+ * the operator and its right operand.
*/
//indent input
int var = p -> member;
diff --git a/usr.bin/indent/lsym_while.c b/usr.bin/indent/lsym_while.c
index 3d3d27f2b1a0..d3d2cf3642fe 100644
--- a/usr.bin/indent/lsym_while.c
+++ b/usr.bin/indent/lsym_while.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_while.c,v 1.6 2023/06/02 15:07:46 rillig Exp $ */
+/* $NetBSD: lsym_while.c,v 1.7 2025/01/03 23:37:18 rillig Exp $ */
/*
* Tests for the token 'lsym_while', which represents the keyword 'while' that
@@ -45,6 +45,7 @@ function(void)
{
{
}
- while (0);
+ while (0)
+ ;
}
//indent end
diff --git a/usr.bin/indent/opt_bad.c b/usr.bin/indent/opt_bad.c
index 51692f37ad43..b2f59e2bd088 100644
--- a/usr.bin/indent/opt_bad.c
+++ b/usr.bin/indent/opt_bad.c
@@ -1,4 +1,4 @@
-/* $NetBSD: opt_bad.c,v 1.12 2023/06/26 14:54:40 rillig Exp $ */
+/* $NetBSD: opt_bad.c,v 1.13 2023/10/22 21:03:08 rillig Exp $ */
/*
* Tests for the options '-bad' and '-nbad'.
@@ -174,7 +174,7 @@ initializer_with_blank(void)
/* comment */
int decl2;
// $ If the declaration is followed by a '}' that terminates the block
- // $ statement, * there is no need for a blank line before the '}'.
+ // $ statement, there is no need for a blank line before the '}'.
}
//indent end
diff --git a/usr.bin/indent/opt_bl_br.c b/usr.bin/indent/opt_bl_br.c
index da79c009cd59..c31283422037 100644
--- a/usr.bin/indent/opt_bl_br.c
+++ b/usr.bin/indent/opt_bl_br.c
@@ -1,4 +1,4 @@
-/* $NetBSD: opt_bl_br.c,v 1.9 2023/05/21 10:18:44 rillig Exp $ */
+/* $NetBSD: opt_bl_br.c,v 1.10 2025/01/03 23:37:18 rillig Exp $ */
//indent input
void
@@ -166,8 +166,7 @@ function(void)
{
stmt();
}
- else
- if (cond)
+ else if (cond)
{
stmt();
}
diff --git a/usr.bin/indent/psym_do_stmt.c b/usr.bin/indent/psym_do_stmt.c
index 773fe8f53041..0afdba24d731 100644
--- a/usr.bin/indent/psym_do_stmt.c
+++ b/usr.bin/indent/psym_do_stmt.c
@@ -1,4 +1,4 @@
-/* $NetBSD: psym_do_stmt.c,v 1.4 2022/04/24 10:36:37 rillig Exp $ */
+/* $NetBSD: psym_do_stmt.c,v 1.5 2025/01/07 03:55:00 rillig Exp $ */
/*
* Tests for the parser symbol psym_do_stmt, which represents the state after
@@ -29,3 +29,21 @@ function(void)
while (0);
}
//indent end
+
+
+//indent input
+{
+ if (cond) do stmt; while (cond); stmt;
+}
+//indent end
+
+//indent run
+{
+ if (cond)
+ do
+ stmt;
+ while (cond);
+ //$ Ensure that this statement is indented the same as the 'if' above.
+ stmt;
+}
+//indent end
diff --git a/usr.bin/indent/psym_else.c b/usr.bin/indent/psym_else.c
index d36532675c29..7ff767593ec9 100644
--- a/usr.bin/indent/psym_else.c
+++ b/usr.bin/indent/psym_else.c
@@ -1,4 +1,4 @@
-/* $NetBSD: psym_else.c,v 1.7 2023/06/16 23:19:01 rillig Exp $ */
+/* $NetBSD: psym_else.c,v 1.8 2025/01/07 02:55:31 rillig Exp $ */
/*
* Tests for the parser symbol psym_else, which represents the keyword 'else'
@@ -42,7 +42,7 @@ example(bool cond)
stmt();
else
stmt();
- /* comment */
+ /* comment */
else
stmt();
}
diff --git a/usr.bin/indent/psym_for_exprs.c b/usr.bin/indent/psym_for_exprs.c
index 72b104751664..b87608b9f065 100644
--- a/usr.bin/indent/psym_for_exprs.c
+++ b/usr.bin/indent/psym_for_exprs.c
@@ -1,4 +1,4 @@
-/* $NetBSD: psym_for_exprs.c,v 1.6 2023/05/15 08:56:39 rillig Exp $ */
+/* $NetBSD: psym_for_exprs.c,v 1.7 2025/01/07 03:14:24 rillig Exp $ */
/*
* Tests for the parser state psym_for_exprs, which represents the state after
@@ -27,3 +27,26 @@ for_loops(void)
//indent end
//indent run-equals-input -ldi0
+
+
+//indent input
+{
+for (ever1)
+for (ever2)
+for (ever3)
+return;
+
+stmt;
+}
+//indent end
+
+//indent run
+{
+ for (ever1)
+ for (ever2)
+ for (ever3)
+ return;
+
+ stmt;
+}
+//indent end
diff --git a/usr.bin/indent/psym_if_expr_stmt.c b/usr.bin/indent/psym_if_expr_stmt.c
index 93c01cfb3811..19966ffbd326 100644
--- a/usr.bin/indent/psym_if_expr_stmt.c
+++ b/usr.bin/indent/psym_if_expr_stmt.c
@@ -1,4 +1,4 @@
-/* $NetBSD: psym_if_expr_stmt.c,v 1.4 2022/04/24 09:04:12 rillig Exp $ */
+/* $NetBSD: psym_if_expr_stmt.c,v 1.5 2025/01/07 03:14:24 rillig Exp $ */
/*
* Tests for the parser symbol psym_if_expr_stmt, which represents the state
@@ -25,3 +25,32 @@ function(void)
//indent end
//indent run-equals-input
+
+
+//indent input
+{
+for (ever1)
+for (ever2)
+for (ever3)
+if (cond1)
+if (cond2)
+if (cond3)
+return;
+
+stmt;
+}
+//indent end
+
+//indent run
+{
+ for (ever1)
+ for (ever2)
+ for (ever3)
+ if (cond1)
+ if (cond2)
+ if (cond3)
+ return;
+
+ stmt;
+}
+//indent end
diff --git a/usr.bin/indent/psym_if_expr_stmt_else.c b/usr.bin/indent/psym_if_expr_stmt_else.c
index 333ff9a712cb..072a77781c39 100644
--- a/usr.bin/indent/psym_if_expr_stmt_else.c
+++ b/usr.bin/indent/psym_if_expr_stmt_else.c
@@ -1,4 +1,4 @@
-/* $NetBSD: psym_if_expr_stmt_else.c,v 1.5 2023/05/11 09:28:53 rillig Exp $ */
+/* $NetBSD: psym_if_expr_stmt_else.c,v 1.7 2025/01/03 23:37:18 rillig Exp $ */
/*
* Tests for the parser symbol psym_if_expr_stmt_else, which represents the
@@ -82,3 +82,33 @@ example(_Bool cond)
}
}
//indent end
+
+
+/*
+ * In many cases, an else-if sequence is written in a single line.
+ * Occasionally, there are cases in which the code is clearer when the
+ * 'else' and 'if' are in separate lines. In such a case, the inner 'if'
+ * statement should be indented like any other statement.
+ */
+//indent input
+void
+example(void)
+{
+ if (cond)
+ stmt();
+ else
+ if (cond)
+ stmt();
+}
+//indent end
+
+//indent run
+void
+example(void)
+{
+ if (cond)
+ stmt();
+ else if (cond)
+ stmt();
+}
+//indent end
diff --git a/usr.bin/indent/psym_while_expr.c b/usr.bin/indent/psym_while_expr.c
index 4eba5c93e7c5..03647d9349c8 100644
--- a/usr.bin/indent/psym_while_expr.c
+++ b/usr.bin/indent/psym_while_expr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: psym_while_expr.c,v 1.5 2023/06/02 15:07:46 rillig Exp $ */
+/* $NetBSD: psym_while_expr.c,v 1.6 2025/01/03 23:37:18 rillig Exp $ */
/*
* Tests for the parser symbol psym_while_expr, which represents the keyword
@@ -38,10 +38,12 @@ function(void)
} while (cond);
if (cmd)
- while (cond);
+ while (cond)
+ ;
{
}
- while (cond);
+ while (cond)
+ ;
}
//indent end
diff --git a/usr.bin/indent/t_errors.sh b/usr.bin/indent/t_errors.sh
index ebd232fa21d6..93e621235169 100644
--- a/usr.bin/indent/t_errors.sh
+++ b/usr.bin/indent/t_errors.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# $NetBSD: t_errors.sh,v 1.37 2023/06/14 19:05:40 rillig Exp $
+# $NetBSD: t_errors.sh,v 1.39 2025/01/03 23:37:18 rillig Exp $
#
# Copyright (c) 2021 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -57,8 +57,8 @@ option_bool_trailing_garbage_body()
-bacchus
}
-atf_test_case 'option_int_missing_argument'
-option_int_missing_argument_body()
+atf_test_case 'option_int_wrong_argument'
+option_int_wrong_argument_body()
{
expect_error \
'indent: Command line: argument "x" to option "-ts" must be an integer' \
@@ -398,7 +398,8 @@ crash_comment_after_controlling_expression_body()
cat <<\EOF > code.exp
{
if (expr
- ) /* c */;
+ ) /* c */
+ ;
}
EOF
@@ -468,7 +469,7 @@ atf_init_test_cases()
{
atf_add_test_case 'option_unknown'
atf_add_test_case 'option_bool_trailing_garbage'
- atf_add_test_case 'option_int_missing_argument'
+ atf_add_test_case 'option_int_wrong_argument'
atf_add_test_case 'option_profile_not_found'
atf_add_test_case 'option_buffer_overflow'
atf_add_test_case 'option_typedefs_not_found'
diff --git a/usr.bin/indent/t_misc.sh b/usr.bin/indent/t_misc.sh
index 02b5bdc5454e..1e0b634052d8 100644
--- a/usr.bin/indent/t_misc.sh
+++ b/usr.bin/indent/t_misc.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# $NetBSD: t_misc.sh,v 1.27 2023/06/05 10:12:21 rillig Exp $
+# $NetBSD: t_misc.sh,v 1.29 2023/12/17 10:02:09 rillig Exp $
#
# Copyright (c) 2021 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -88,12 +88,12 @@ verbose_profile_body()
profile: -fc1
EOF
- # The code in args.c function set_profile suggests that options from
- # profile files are echoed to stdout during startup. But since the
+ # The code in args.c function load_profile suggests that options from
+ # profile files are echoed to stderr during startup. But since the
# command line options are handled after the profile files, a '-v' in
# the command line has no effect. That's why '-bacc' is not listed
- # in stdout, but '-fc1' is. The second round of '-bacc', '-v', '-fc1'
- # is listed because when running ATF, $HOME equals $PWD.
+ # on stderr, but '-fc1' is. The second round of '-bacc', '-v', '-fc1'
+ # is listed because when running the test via ATF, $HOME equals $PWD.
atf_check \
-e 'file:stderr.exp' \
@@ -205,15 +205,16 @@ option_P_in_profile_file_body()
atf_test_case 'option_without_hyphen'
option_without_hyphen_body()
{
- # TODO: Options in profile files should be required to start with
- # '-', just like in the command line arguments.
+ # Ensure that options in profile files start with '-', just like
+ # command line options.
printf ' -i3 xi5 +di0\n' > .indent.pro
printf '%s\n' 'int var[] = {' '1,' '}' > code.c
- printf '%s\n' 'int var[] = {' ' 1,' '}' > code.exp
- atf_check -o 'file:code.exp' \
+ atf_check \
+ -s 'exit:1' \
+ -e "match:/.indent.pro: option \"xi5\" must start with '-'" \
"$indent" < code.c
}
diff --git a/usr.bin/indent/t_options.lua b/usr.bin/indent/t_options.lua
index c29cb0e9d5f1..cef49e368fca 100644
--- a/usr.bin/indent/t_options.lua
+++ b/usr.bin/indent/t_options.lua
@@ -1,4 +1,4 @@
--- $NetBSD: t_options.lua,v 1.7 2023/06/26 12:21:18 rillig Exp $
+-- $NetBSD: t_options.lua,v 1.8 2024/12/12 05:33:47 rillig Exp $
--
-- Copyright (c) 2023 The NetBSD Foundation, Inc.
-- All rights reserved.
@@ -24,11 +24,10 @@
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--- usage: [INDENT=...] lua t_options.lua <file>...
+-- usage: [INDENT=...] lua t_options.lua <file.c>...
--
--- Test driver for indent that runs indent on several inputs, checks the
--- output and can run indent with different command line options on the same
--- input.
+-- Run indent on several inputs with different command line options, verifying
+-- that the actual output equals the expected output.
--
-- The test files contain the input to be formatted, the formatting options
-- and the output, all as close together as possible. The test files use the
@@ -41,7 +40,8 @@
-- //indent end
-- Finishes an '//indent input' or '//indent run' section.
-- //indent run-equals-input [options]
--- Runs indent on the input, expecting unmodified output.
+-- Runs indent on the input, expecting that the output is the
+-- same as the input.
-- //indent run-equals-prev-output [options]
-- Runs indent on the input, expecting the same output as from
-- the previous run.
@@ -52,7 +52,7 @@
-- are filtered out, they can be used for remarks near the affected code.
--
-- The actual output from running indent is written to stdout, the expected
--- test output is written to 'expected.out'.
+-- test output is written to 'expected.out', ready to be compared using diff.
local warned = false
@@ -78,7 +78,7 @@ local output_lineno = 0
local expected_out = assert(io.open("expected.out", "w"))
-local function die(ln, msg)
+local function err(ln, msg)
io.stderr:write(("%s:%d: error: %s\n"):format(filename, ln, msg))
os.exit(false)
end
@@ -112,9 +112,8 @@ end
local function check_empty_lines_block(n)
if max_empty_lines ~= n and seen_input_section then
- local lines = n ~= 1 and "lines" or "line"
warn(lineno, ("expecting %d empty %s, got %d")
- :format(n, lines, max_empty_lines))
+ :format(n, n ~= 1 and "lines" or "line", max_empty_lines))
end
end
@@ -139,23 +138,23 @@ local function run_indent(inp, args)
end
end
-local function handle_empty_section(line)
+local function handle_line_outside_section(line)
if line == "" then
curr_empty_lines = curr_empty_lines + 1
- else
- if curr_empty_lines > max_empty_lines then
- max_empty_lines = curr_empty_lines
- end
- if curr_empty_lines > 0 then
- if prev_empty_lines > 1 then
- warn(lineno - curr_empty_lines - 1,
- prev_empty_lines .. " empty lines a few "
- .. "lines above, should be only 1")
- end
- prev_empty_lines = curr_empty_lines
+ return
+ end
+ if curr_empty_lines > max_empty_lines then
+ max_empty_lines = curr_empty_lines
+ end
+ if curr_empty_lines > 0 then
+ if prev_empty_lines > 1 then
+ warn(lineno - curr_empty_lines - 1,
+ prev_empty_lines .. " empty lines a few "
+ .. "lines above, should be only 1")
end
- curr_empty_lines = 0
+ prev_empty_lines = curr_empty_lines
end
+ curr_empty_lines = 0
end
local function handle_indent_input()
@@ -264,7 +263,7 @@ local function handle_indent_directive(line, command, args)
elseif command == "end" then
warn(lineno, "misplaced '//indent end'")
else
- die(lineno, "invalid line '" .. line .. "'")
+ err(lineno, "invalid line '" .. line .. "'")
end
prev_empty_lines = 0
@@ -273,7 +272,7 @@ end
local function handle_line(line)
if section == "" then
- handle_empty_section(line)
+ handle_line_outside_section(line)
end
-- Hide comments starting with dollar from indent; they are used for
@@ -326,7 +325,7 @@ local function main()
handle_file(arg)
end
if section ~= "" then
- die(lineno, "still in section '" .. section .. "'")
+ err(lineno, "still in section '" .. section .. "'")
end
check_unused_input()
expected_out:close()
diff --git a/usr.bin/netpgpverify/Makefile b/usr.bin/netpgpverify/Makefile
index da574f7f6b41..4a8443fba09a 100644
--- a/usr.bin/netpgpverify/Makefile
+++ b/usr.bin/netpgpverify/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.1 2012/11/20 07:55:54 agc Exp $
+# $NetBSD: Makefile,v 1.3 2026/01/30 09:01:08 wiz Exp $
.include <bsd.own.mk>
@@ -6,4 +6,61 @@ TESTSDIR= ${TESTSBASE}/usr.bin/netpgpverify
TESTS_SH+= t_netpgpverify
+# data/D5B22A28.{pub,secret} is the keys used for message*
+
+FILESDIR= ${TESTSDIR}/data
+FILES+= data/NetBSD-6.0_hashes.asc.gz
+FILES+= data/a.gpg
+FILES+= data/b.gpg
+FILES+= data/det
+FILES+= data/det.sig
+FILES+= data/dsa-pubring.gpg
+FILES+= data/expected16
+FILES+= data/expected17
+FILES+= data/expected18
+FILES+= data/expected19
+FILES+= data/expected20
+FILES+= data/expected21
+FILES+= data/expected22
+FILES+= data/expected23
+FILES+= data/expected24
+FILES+= data/expected25
+FILES+= data/expected26
+FILES+= data/expected27
+FILES+= data/expected28
+FILES+= data/expected29
+FILES+= data/expected30
+FILES+= data/expected31
+FILES+= data/expected32
+FILES+= data/expected33
+FILES+= data/expected34
+FILES+= data/expected35
+FILES+= data/expected36
+FILES+= data/expected37
+FILES+= data/expected38
+FILES+= data/expected39
+FILES+= data/expected40
+FILES+= data/expected41
+FILES+= data/expected42
+FILES+= data/expected43
+FILES+= data/expected44
+FILES+= data/expected45
+FILES+= data/expected46
+FILES+= data/in1.asc
+FILES+= data/in1.gpg
+FILES+= data/in2.asc
+FILES+= data/in2.gpg
+FILES+= data/jj.asc
+FILES+= data/message
+FILES+= data/message.keyring
+FILES+= data/message.v1.asc
+FILES+= data/message.v1.asc.expected
+FILES+= data/message.v1.sig
+FILES+= data/message.v1.sig.expected
+FILES+= data/message.v2.asc
+FILES+= data/message.v2.asc.expected
+FILES+= data/message.v2.sig
+FILES+= data/message.v2.sig.expected
+FILES+= data/pubring.gpg
+
.include <bsd.test.mk>
diff --git a/usr.bin/netpgpverify/Testspec b/usr.bin/netpgpverify/Testspec
index d04f4ad607c9..c6ae4b65c9f0 100644
--- a/usr.bin/netpgpverify/Testspec
+++ b/usr.bin/netpgpverify/Testspec
@@ -1,6 +1,6 @@
#! /bin/sh
-# $NetBSD: Testspec,v 1.2 2016/06/01 14:52:56 agc Exp $
+# $NetBSD: Testspec,v 1.3 2024/04/28 07:27:42 rillig Exp $
# Copyright (c) 2016 Alistair Crooks <agc@NetBSD.org>
# All rights reserved.
@@ -58,30 +58,30 @@ expected33
expected34
expected35
'
-TESTSET_1_CASE_1="-s eq:0 -o file:1.expected -e empty b2e < 1.in"
-TESTSET_1_CASE_2="-s eq:0 -o file:2.expected -e empty b2e < 2.in"
+TESTSET_1_CASE_1="-s exit:0 -o file:1.expected -e empty b2e < 1.in"
+TESTSET_1_CASE_2="-s exit:0 -o file:2.expected -e empty b2e < 2.in"
-TESTSET_1_CASE_1="-s eq:0 -o file:expected16 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify b.gpg"
-DISABLE_TESTSET_1_CASE_2="-s eq:0 -o file:expected17 -e empty netpgpverify -c verify a.gpg"
-TESTSET_1_CASE_3="-s eq:0 -o file:expected18 -e empty env TZ=US/Pacific netpgpverify -c verify a.gpg"
-TESTSET_1_CASE_4="-s eq:0 -o file:expected19 -e empty env TZ=US/Pacific netpgpverify -c verify NetBSD-6.0_RC2_hashes.asc"
-TESTSET_1_CASE_5="-s eq:0 -o file:expected20 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat jj.asc"
-TESTSET_1_CASE_6="-s eq:0 -o file:expected21 -e empty env TZ=US/Pacific netpgpverify < a.gpg"
-TESTSET_1_CASE_7="-s eq:0 -o file:expected22 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < jj.asc"
-TESTSET_1_CASE_8="-s eq:0 -o file:expected23 -e empty env TZ=US/Pacific netpgpverify < NetBSD-6.0_RC2_hashes.asc"
-TESTSET_1_CASE_9="-s eq:0 -o file:expected24 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < b.gpg"
-DISABLE_TESTSET_1_CASE_10="-s eq:0 -o file:expected25 -e empty netpgpverify NetBSD-6.0_RC1_hashes.gpg"
-DISABLE_TESTSET_1_CASE_11="-s eq:0 -o file:expected26 -e empty netpgpverify < NetBSD-6.0_RC1_hashes.gpg"
-TESTSET_1_CASE_12="-s eq:0 -o file:expected27 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < NetBSD-6.0_hashes.asc"
-TESTSET_1_CASE_13="-s eq:0 -o file:expected28 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg NetBSD-6.0_hashes.asc"
-DISABLE_TESTSET_1_CASE_14="-s eq:0 -o file:expected29 -e empty netpgpverify NetBSD-6.0_RC1_hashes_ascii.gpg"
-DISABLE_TESTSET_1_CASE_15="-s eq:0 -o file:expected30 -e empty netpgpverify < NetBSD-6.0_RC1_hashes_ascii.gpg"
-TESTSET_1_CASE_16="-s eq:0 -o file:expected31 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg b.gpg b.gpg"
-TESTSET_1_CASE_17="-s eq:0 -o file:expected32 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg b.gpg b.gpg b.gpg"
-TESTSET_1_CASE_18="-s eq:0 -o file:expected33 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg jj.asc b.gpg"
-TESTSET_1_CASE_19="-s eq:0 -o file:expected34 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg det.sig"
-TESTSET_1_CASE_20="-s eq:0 -o file:expected35 -e empty env TZ=US/Pacific netpgpverify -c cat -k pubring.gpg det.sig"
-DISABLE_TESTSET_1_CASE_21="-s eq:0 -o file:expected46 -e empty netpgpverify -k problem-pubring.gpg NetBSD-6.0_hashes.asc"
+TESTSET_1_CASE_1="-s exit:0 -o file:expected16 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify b.gpg"
+DISABLE_TESTSET_1_CASE_2="-s exit:0 -o file:expected17 -e empty netpgpverify -c verify a.gpg"
+TESTSET_1_CASE_3="-s exit:0 -o file:expected18 -e empty env TZ=US/Pacific netpgpverify -c verify a.gpg"
+TESTSET_1_CASE_4="-s exit:0 -o file:expected19 -e empty env TZ=US/Pacific netpgpverify -c verify NetBSD-6.0_RC2_hashes.asc"
+TESTSET_1_CASE_5="-s exit:0 -o file:expected20 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat jj.asc"
+TESTSET_1_CASE_6="-s exit:0 -o file:expected21 -e empty env TZ=US/Pacific netpgpverify < a.gpg"
+TESTSET_1_CASE_7="-s exit:0 -o file:expected22 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < jj.asc"
+TESTSET_1_CASE_8="-s exit:0 -o file:expected23 -e empty env TZ=US/Pacific netpgpverify < NetBSD-6.0_RC2_hashes.asc"
+TESTSET_1_CASE_9="-s exit:0 -o file:expected24 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < b.gpg"
+DISABLE_TESTSET_1_CASE_10="-s exit:0 -o file:expected25 -e empty netpgpverify NetBSD-6.0_RC1_hashes.gpg"
+DISABLE_TESTSET_1_CASE_11="-s exit:0 -o file:expected26 -e empty netpgpverify < NetBSD-6.0_RC1_hashes.gpg"
+TESTSET_1_CASE_12="-s exit:0 -o file:expected27 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < NetBSD-6.0_hashes.asc"
+TESTSET_1_CASE_13="-s exit:0 -o file:expected28 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg NetBSD-6.0_hashes.asc"
+DISABLE_TESTSET_1_CASE_14="-s exit:0 -o file:expected29 -e empty netpgpverify NetBSD-6.0_RC1_hashes_ascii.gpg"
+DISABLE_TESTSET_1_CASE_15="-s exit:0 -o file:expected30 -e empty netpgpverify < NetBSD-6.0_RC1_hashes_ascii.gpg"
+TESTSET_1_CASE_16="-s exit:0 -o file:expected31 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg b.gpg b.gpg"
+TESTSET_1_CASE_17="-s exit:0 -o file:expected32 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg b.gpg b.gpg b.gpg"
+TESTSET_1_CASE_18="-s exit:0 -o file:expected33 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg jj.asc b.gpg"
+TESTSET_1_CASE_19="-s exit:0 -o file:expected34 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg det.sig"
+TESTSET_1_CASE_20="-s exit:0 -o file:expected35 -e empty env TZ=US/Pacific netpgpverify -c cat -k pubring.gpg det.sig"
+DISABLE_TESTSET_1_CASE_21="-s exit:0 -o file:expected46 -e empty netpgpverify -k problem-pubring.gpg NetBSD-6.0_hashes.asc"
TESTSET_2_NAME=dsa_signatures
TESTSET_2_FILES='
@@ -102,13 +102,13 @@ expected44
expected45
expected46
'
-TESTSET_2_CASE_1="-s eq:0 -o file:expected36 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.gpg"
-TESTSET_2_CASE_2="-s eq:0 -o file:expected37 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.gpg"
-TESTSET_2_CASE_3="-s eq:0 -o file:expected38 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.asc"
-TESTSET_2_CASE_4="-s eq:0 -o file:expected39 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.asc"
-TESTSET_2_CASE_5="-s eq:0 -o file:expected40 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.gpg"
-TESTSET_2_CASE_6="-s eq:0 -o file:expected41 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.gpg"
-TESTSET_2_CASE_7="-s eq:0 -o file:expected42 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.asc"
-TESTSET_2_CASE_8="-s eq:0 -o file:expected43 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.asc"
-TESTSET_2_CASE_9="-s eq:0 -o file:expected44 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.gpg"
-TESTSET_2_CASE_10="-s eq:0 -o file:expected45 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.asc"
+TESTSET_2_CASE_1="-s exit:0 -o file:expected36 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.gpg"
+TESTSET_2_CASE_2="-s exit:0 -o file:expected37 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.gpg"
+TESTSET_2_CASE_3="-s exit:0 -o file:expected38 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.asc"
+TESTSET_2_CASE_4="-s exit:0 -o file:expected39 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.asc"
+TESTSET_2_CASE_5="-s exit:0 -o file:expected40 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.gpg"
+TESTSET_2_CASE_6="-s exit:0 -o file:expected41 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.gpg"
+TESTSET_2_CASE_7="-s exit:0 -o file:expected42 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.asc"
+TESTSET_2_CASE_8="-s exit:0 -o file:expected43 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.asc"
+TESTSET_2_CASE_9="-s exit:0 -o file:expected44 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.gpg"
+TESTSET_2_CASE_10="-s exit:0 -o file:expected45 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.asc"
diff --git a/usr.bin/netpgpverify/t_netpgpverify.sh b/usr.bin/netpgpverify/t_netpgpverify.sh
index 2d532c0cb72d..d6c54a1dbd46 100644
--- a/usr.bin/netpgpverify/t_netpgpverify.sh
+++ b/usr.bin/netpgpverify/t_netpgpverify.sh
@@ -1,6 +1,6 @@
#! /bin/sh
-# $NetBSD: t_netpgpverify.sh,v 1.4 2016/08/28 15:59:15 christos Exp $
+# $NetBSD: t_netpgpverify.sh,v 1.7 2026/01/30 09:01:08 wiz Exp $
#
# Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -51,7168 +51,34 @@ netpgpverify_testset_1_rsa_signatures_head() {
atf_set "descr" "Test set 1 (rsa_signatures) for netpgpverify"
}
netpgpverify_testset_1_rsa_signatures_body() {
- uudecode << EOF
-begin-base64 644 a.gpg
-owGbwMvMwMQonXHnz4HIDGXGNduSGBPD/Rq2KSuo+KWWOAW7WCn4JmanpmXmpOqU
-KRjqGSoYGRga6Rsa6hsZKBiYW5maWpmaKCSmJyu4VhQoqHBx6WXmJeeUpqQq2CQV
-p+jll+fp5WbbcXGFuAaHBLt4BtkqqFSD2U6Owa61+qXFRXpJmXn6eaklBekFZalF
-mWmVUMXxwR7atgol8ahSqMaXpBaXgM3vZJRhYWBkYmBjZQK5noGLUwDmp2X32f/X
-n4pynyaz+0jbeluli8/NgkI2bK65Ud+ecUelqkvNaXlNVo3TKyX9TuNUpmX3l7l2
-t2xy4e8veH8/OpurgK9V4EXAB98rbddTgtpzTxhuWH5x0Qf3O0xOzL5MR5SfLH7/
-zJMl72uqUExspt5UJuXIEw+LTj2JKfA7Mcl219+lKebOVlfqpA20HzSeXmaatynY
-NrX2BWfpS++vxxJiWL/wtLvzSVk/uZVunlXBsfDV/rbUxFDGPdMuNT/98f6cQ1Fz
-/+nLOY84rsk7K/NnulZuvNzb9jw3Qv58qPvep1saRDy6XhcUxhwOmZvh1DvLz/HG
-HNZMdVcl/iahoFURvHryU72zzz5eKXgoSc0SAA==
-====
-EOF
- uudecode << EOF
-begin-base64 644 b.gpg
-xA0DAAgBG2jc/MBZaCMBy4tiAAAAAABQUk9HPXAKU1JDUz1wYXJzZS5jCldBUk5T
-PTUKTUtNQU49bm8KQ1BQRkxBR1MrPS1nIC1PMApMREZMQUdTKz0tZyAtTzAKCi5p
-bmNsdWRlIDxic2QucHJvZy5taz4KCnQ6ICR7UFJPR30KCS4vJHtQUk9HfSBncGdz
-aWduZWQtYS5ncGcKwsBiBAABCAAWBQJQTZOaBQMAAAAACRAbaNz8wFloIwAABTcH
-/RhxktWLH3Cw6YkC/4Wcm9yq6flgiKQsB0VUaVgmmOfWnLxcowyH5ISENo/J6qhT
-S8Z0B2lAkRzBhXbfSe8GoESc/NsXTuOIvdjZEy7FBkl9Lumuqp1IlmoXh3RgPv5Z
-gcJ+uDCV958uXAxLn017xN/CVKi5yBiNWWk/mOJuI8FCiQCyFVQ3dOXcFU/gf4iZ
-YkH6OMX6eNpLQXp+s1ar6ZqpFE09QEoiFuIiDas+V6g0IG1c+PgP+TOlO5ztaKjx
-XxejP0Thtft0T+AKTANVrtx+aTseVt4CR3jBt0n4CJjTTRQwnIYxGML3ddgMXSPT
-0c4J/4dwyMqdDuhby//52Nw=
-====
-EOF
- uudecode << EOF
-begin-base64 644 det
-VG8gRG8KPT09PT0KdGVzdHMgd2l0aCAtayBzaWcKZGV0YWNoZWQgc2lncwpEU0EK
-CkRvbmUKPT09PQpiYXNpY3MKbG9jYWxpc2UgcGdwX3JlYWRfcGFja2V0cwpmaXgg
-bGludApXQVJOUz01CmxpYiBtYW4gcGFnZQpwcm9nIG1hbiBwYWdlCmRvIHdlIGRv
-IGl0IHN0YXRpY2FsbHkgbGlua2VkIGFzIHdlbGw/Cm11bHRpcGxlIGZpbGVzIGlu
-IG5ldHBncHZlcmlmeQo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 det.sig
-iQEcBAABAgAGBQJQf8gBAAoJEBto3PzAWWgjbLoH/i9MZSv2l9lJ5O+bfGmRSUxe
-rGeAM0dq//xi+AABByDEWNYORq2I6CO6k2eVPv7YbNE2Whn7qXA6U7LotM7Lt61l
-MCLRhuTv9RViV1qzsy+Z8VAQmhERAcG/qA5JSQbzjuVYhg5FexpiVmxgG9L8Z/Oj
-4pU9zIId1vH7CvAcy/mfSyM8Ih8bmsrgs9b1wzMPLQKl0v0jtcrEcnwMtscXa9Mw
-X66bHxCHtRyGcWsHU8Ab2fJCvsCbBBMtg3JjZ7+VgDoZqPqBgIkhmppqC05vU5QR
-leNo8g9OwiJ6fMtdwTMsFkxqjjVKk5//X/6jQd/mf55XcxLOw4UK4ev5ADExnOU=
-====
-EOF
- uudecode << EOF
-begin-base64 644 jj.asc
-LS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLQpIYXNoOiBTSEExCgox
-LiB0YWcgJiAweDNmCjIuIGxlbgoKb25lIHBhc3MgKHRhZyA0KQo9PT09PT09PQpi
-IHZlcnNpb246MwpiIHNpZyB0eXBlCmIgaGFzaCBhbGcKYiBwdWJrZXkgYWxnCjhi
-IGtleWlkCgpsaXRlcmFsIGRhdGEgKHRhZyAxMSkKPT09PT09PT09PT09PQpiIGJp
-bmFyeS90ZXh0CmIgbGVuZ3RoCmMgc3RyaW5nCkwgbXRpbWUKdGV4dAotLS0tLUJF
-R0lOIFBHUCBTSUdOQVRVUkUtLS0tLQpWZXJzaW9uOiBHbnVQRyB2MS40LjExIChO
-ZXRCU0QpCgppUUVjQkFFQkFnQUdCUUpRYUlaY0FBb0pFQnRvM1B6QVdXZ2o2NzhJ
-QUxiREhvbjNSbTZxVWhuN2sxVEZUNkQzCnlpL2p6ZjNwaVNKR3NnVWcyd0VnaHMx
-NzVlZEMvY0pLM2xHOUd4LzMvdVFxMDZSOWczN25WUlg4STBzSzd5VDIKWGdSK1JI
-b0doL2IrQ1F4ZFJOQyt1YjVRb05iOExjbUNiL01RR3EyS0s5b3RTRXhpeTRXTVVQ
-NEsxRGJsYUs1TAorSGc0VlRvb01vdDFOVnF5RlNvQjJhWmF1WGMyRjRaVmg1cTBm
-bjh3NUdFdzQ1UCtBVVVibXpwZ2JMd1hibCtJCnRNc1g1NFYxZHh5RGNDWVVzMHhV
-SC9WeEpVUUVlSWxEYkNPWFlNYkNWdGdnWVJxS2tzVHIrdS9yaXcvTGxucWwKalFk
-cTVyQlJXMVNsRDdMbDZ6L0xGMldCSk9XdEh6cDRxYm5CR1NxNXVCMXEzN0gzbVdM
-MjhmMXRMLy9UVWpNPQo9RVg4VwotLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0K
-====
-EOF
- uudecode << EOF
-begin-base64 644 pubring.gpg
-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
-StZtC+VbuN66pfHwsAIAAw==
-====
-EOF
- uudecode << EOF
-begin-base64 644 NetBSD-6.0_hashes.asc.gz
-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
-tyqIlNwhRRNj3K46lymZxdG+jMqP50E7d6omJEqsrdBOyVztIJMqO/9/5t6tx7Yk
-OdL7R6O4X171KggDSBhAb0RcBw2J7AKbwHD+vT5bJ7MrV56duSOzzgCHZLOq67L2
-3ssj3M0i3M2s++Cg6l//9sc/vtSrtkwTM3Qyk6AGQ+aMWiFFRLXou1pMamkfxeyr
-n2fZCtKCy7oWrxoZIH5d22OrM6LHLbNldhokyjUoysV+qNVr1wjVt45tCBU3BF4S
-jUFmKlOKv5RPCP8lUalm0wmwBEBkzWiQZbI0l6P9kJV99XcoxNEngr7rJXftdHNl
-NlVWHcPsyi4lafsw2l8O0iyiFU4tWK4V+cP2JMCutgTf3FeXwr1rdfJ+glPCLH5m
-zV/olkui+2woGRQNnVOM/fUlcP8cE6d6rQFMQhyztySti8v6RDPj3Wd2MYQRFGLm
-VJOXTu63fOs0WeY1FN5tzLwM6Hoi3Q+1xJCotRrUXNM04TcmHFllFFbQdtM8q+yd
-R/166N/JWkmyNy19ZBu6RQ6XI42Am1U+F131fc4vhvydqlXXGQ1fswQTryZSiLCT
-IryRUlT77q5/nbSEMjRe9ZyS48qAD11l1ibFgB78AGHM6Pb3d/sLFQYuOskoOFA3
-u9LIlBNaFwC2/BjZGqQIOpe7xLDXQJ2TAab8EsnGidUIHU8D7JkoZFs3hH56WeQ6
-L0kWSbX7rK4o4APpSX1aUqwrXtPr+/u7/JVxU1hWUmtIANUak9jtQAOeGSflSB6O
-VKH0zd39KpOm06VcItzEF5lCtxVlGNuMDp/z81A/8PVRCmczgeF94FuyoeWzNrr0
-G6FdQiNtf0wlPn8673ZDvJsV/CXVkcsBH7rDbbDlbeTpQArsgc/LItFAPPaLug67
-JlhBBJr69l3zieRyNnYXopWDh24QG5gQ2OGCTAZ03HhdtO0AyJGPgD0J64MWUk3i
-sqs0dkSloeZc7tbqJJAQXQtBLm9xPw3mI2G0qU7ZoTGvreEgp3bnMrwm1ZwphyH8
-hU2knz37d+0i/ew7/6U20s8e/L0+0p+f+AsbST99+O/aSfr5G/krraSfPvl7vaQ/
-PfJhl11X58rmlbbRt9zbqmwRdRI/pbCpsaVVPu57OvoQyohOV7rEXoRuqSYuFXXS
-QOaq0l2lIEi3THd+YYyise4kwRLJmhkFLm6AumUHs4/DJo9JfyVCYclEUrRK0jQu
-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
-0EbuVRbNvuqeIyzPHtaZBRUy5fhekE8fJfe2bSQElczwIC5wY3ckJtlshwUhHc0V
-6dixqqqkB03uzdpOuSp16zjYs1iCISPbEs1iJ2mgNxaygRW7D+WQpJfeURNJlaKT
-teyFzVbo74X69BOWDqel4WZj8i2RnsZh9dS9BfBuJ01RlYw3An76HL2l5rxvRleH
-uqYHo+RQu+6j4Mnvhf2f/nv4p7/7tUNE1kawvVo7gIoSNuAB0jCAiQ+d0MnVJb0b
-9puPgkcKtkhuIAcdkxAK0OrWnMjoY5ETy2pqsJONyMhNfguHsOXSob/MKrSbvXPh
-uD5coU+pvrajLZxUkewxbX+g29UKPGOyFX2lQq+VzLthv/kJMRXJSHRxlwywWyCv
-47oidguz9TY1D+mcb4X95nMyK7noaESKmuqy7pI1A07lxNv41A3j/gf81//5T//w
-j18fDB2AeYriiHeyp5qOEyW+oOlgUmrr5pvi/Avhvv0Iy0bQyRUwF8rbu5WqvwCd
-/BIPsdd9EH/pKFvHRzqZ29SSi5WrSWyHCxq5SM25OS6Ac5yasxQHTw3cJg2jCES3
-JQ8y6xS/tFFiakZ3nK+F+farS6dBLbGFfNLlrZx1YJtWYxmyE0qXwW6Z6ZXw3j4f
-2laUrCWrs2WIO5p0nyOPXG0V+1JY/9v//E//4+///j//519vLFgYvKWkQ6plvJfd
-JXxd4gHZ7hbVQEDpfDGyHz7FfvEOS5qRmmxVAFklWoQXGt+XIpUkFT+tukrc1vWJ
-Lor3MaEaR9vgnjyDhC7VEwZzXxp7Am57ie0VFgD/XtrkVM1ueV6/Y4FIMko9fy8G
-98O37+QIvq92LCSlSe9vFl7SlPI26FqOVeCa/Ep8P3yEJM2dm8blEPhxuoANZGrZ
-HVPKSnsrxP/8P/7+//kWgCI/vuGmVXsx5MPqzYUGxhfnz8doNlvlzTDffFIiD1MX
-dGs657JykipqqZ1xQ4hSLUkld0JsReODJrShJk7uhXX7YKTRA7rdzslDIEsWiARe
-mpFPNxyPPwNvWP4BG3jKIQ+u3NUj2ADlY70Z6ptfsFvXKSN7YpbSJC4qffgaHWsP
-yt+0usZ8DXd/8jFy92MJFXErCalQOouASUkCOp/6Ddw+/w8d3Hr04B9ycOvRF35/
-cOvRU98Y3Pr94/6owa2HT/4hB7cev4u3B7cePvaNwa3fPe800wBr/tXTi4erTX7z
-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
-U/o9Sm1r56e/gN/ulLvyMsZPONUwbMCMlre0xtm1YsKkim4T2i5Ukq9uO2yLM4Zt
-UCkR2CFepQt0dPlIcGhhe6F/FTJ9SKJB/gfz499IgnNIEunP6gU293Twf/sFC1jD
-LIwxA+H0TqbvifEXgdVEixlKck/G/bfbOL2EiZ8Lw2dpKbOnWGgZmUFvwaRvhvxl
-xW+EwQuKG4p4R0VFOC+Ka1llFUUhF/pz3Lfj/come/IDm3QtVEEaFeFER5Bgq2f2
-pymOKBnXmJSm8XlbGd0zRb1gkVD1Pu1lmuDyWKIG2IW5jftcwlssm23EgZuCjQS9
-mH+IU5cvMSOEur8d7NceYpFUfaWMRS3PLCS+mIJVTpwsuGBUZpnN/V6kX7a8w0w7
-CSS4EvJKO2LNhXHfyFlwZn4zwb+Qyb2UTumxEUkyWC2AWgTDo9abwUbWqaTv8e3E
-/rKmmersfY6NRhrz1AMpRz1/7UkcKjXf0XtnWBJbheV3NK4LovWrX7YpbALhZrPq
-tdz32F7cC1iPztFe9MDo46/oji7BMd1N5Hu65JUCW/h2Qn/Z4kYaCimMKUiytKSt
-KaoVwo6T42p9Sq1bP/L3EvnravY7Ny24yXlfS9EzFiuWNZL+x65fhvkPV/b5+NJ/
-tto+Hz/y/566z8fX/aa+z9sL/pEKP59c+89W4+ez9/G/pfLzyYW/qfPz5oq3wd6/
-+3e/ZvD80quKWy8klShUdilL6PvXDYfKApZF8ZOewLPbOEbYVQ61vAp1v2nR4Uy7
-xZVX5HSyqWpcJwk4QgcMneqEZwanou4nJ6kelVfT/aA/Hj3liA+b6mRr+jiSvvBW
-LWPFeuGqzXpF7I8EnENPA/rB4/uMT+Fm0mLYrOx9zUxYfXeKjNZoV4JX0jpblR/c
-I5uZ7ArIQxS9KvJhStOgia/fZNdZmB+btcWBOKQXac3CmWEWn9zqYuwisioRU8Gg
-+pjT2N4azPH/SPR3gVCwfsZsnYOTLELLPsBiTL7pntfs4mzbF6PirX8SYxuYKaKQ
-U/RfWnjVrCsbCZ13fQhpLIU7bfwvMNSdGbata64LZXhznFpvOkU+GubLPO1m6Ogg
-bm9aqVE3Skxg6HmTj0dRvL9oDNH1jsfI+lExhcuBeXcXWm4fylu8ueLj7La+c3h8
-pC3eeKPKuui5a0ooClyqkQErVcXT0N1UhThajN4IG8SOXlUbNSmbGNWXNe0aPQQf
-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
-63c/sI/ST4/uP3o073xx/8aDm+HLr38bX5V47dcHz2u62b6zz0f+/vY/3/vxYf/P
-90+fPPzllzvzw/FjdD9c/+fNx/Gbn6//+lX7/BMfvjS3W3ny4vdP7z/76scv71xL
-dz+5+8v9B789/+H6jY++8f/qD5/867tvf/v1vbvP4/Wv8r3nn62n//zhy2dPzZ1b
-X//7s0dPv8wf/+fn8u+b8fntj3+pz679+HG4ux798uv2y7f3y70Pknn69cOfPv3h
-obt/68EHd776bdz843n/6ZPtm4fzwW/XP37+6fNfvvnm2b343c/Xn4YX9vtrX3zz
-2U+Pv3/85fxo3rz/9ffX/xjLfPPi92d/rJ8+eXr39+/urC/y9+/d/c+PH7XH1/+1
-nt6+c/uLfHM9fHAvXQ9ffPjztce3bt2xjx494P6s3Pn27vXfb/vb7bv1zdMb9vH2
-5Na/f/rnJy/K7x8+/+TO/burfPX8n/67B5+37x+/mA+++/Wzm9f+Yz//9tvf/C/x
-0U3/6ON79Yu7f3ypiPC5+f7bh09vvBf79a/uvffVk5+efGDufdp+/fDZD7999/TO
-i7r9/uzzX839G9duf5TN3X/a+3cf3Lz707I37j364vtfPv3xt3+t35W6Xe/6bfnx
-/V/e++3x7Yc/fPHj7Wc3Xnx076MH6+GjP8rPX975+doH//7i+bOP/p3vv7jR4s9P
-zQfun59tN756+tuzm7d+/DLdjvX6oxg+/Ohbc7/Gr/8I9cUq929/9MX12+3FXD9+
-cu36XXvj0zuPXPz9h9/6oz8++LLceTpvP/sgmE8e/7g9efLRk5u/vLiRf/rsl/DA
-3X04f/vpAz9/efrTN0/lc9972q+ZB1/f//zZjU9a/P73p4+/IF15+OT2rVuf3r31
-3Yzxu/7Tg3L/0xeP37t+3z76z40H9sObn3//6EF58Um7/ezu7XvX4h/3fnh+45O7
-5fP5xwfmgf3mvV8/uvZ/H33yXT/ZJLc+v3neFvn/qZKFEe79DQA=
-====
-EOF
- gunzip NetBSD-6.0_hashes.asc.gz
- uudecode << EOF
-begin-base64 644 expected16
-R29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAwMDoxNToz
-OCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikg
-MWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQxNSA5
-ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlk
-ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j
-b20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3JjLm9y
-Zz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qub3Jn
-Pgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXguY29t
-PgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected17
-R29vZCBzaWduYXR1cmUgZm9yIGEuZ3BnIG1hZGUgU3VuIFNlcCAgOSAxNzo0NDox
-MSAyMDEyCnNpZ25hdHVyZSAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikgMWI2
-OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50OiAgZDQxNSA5ZGVi
-IDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlkICAg
-ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j
-b20+CnVpZCAgICAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3Jj
-Lm9yZz4KdWlkICAgICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRi
-c2Qub3JnPgp1aWQgICAgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5l
-dGZsaXguY29tPgplbmNyeXB0aW9uIDIwNDgvUlNBIChFbmNyeXB0IG9yIFNpZ24p
-IDc5ZGViNjFlNDg4ZWVlNzQgMjAwNC0wMS0xMgpmaW5nZXJwcmludDogIDU3YzAg
-YzFlNiBiZjcxIDg4NDUgNDE2YiA5NTIyIDc5ZGUgYjYxZSA0ODhlIGVlNzQgCgo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected18
-R29vZCBzaWduYXR1cmUgZm9yIGEuZ3BnIG1hZGUgVHVlIE1heSAzMSAyMzoyOTox
-MCAyMDE2CnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikg
-MWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQxNSA5
-ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlk
-ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j
-b20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3JjLm9y
-Zz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qub3Jn
-Pgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXguY29t
-PgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected19
-R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfUkMyX2hhc2hlcy5hc2MgbWFk
-ZSBXZWQgU2VwIDE5IDA3OjUzOjE4IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAo
-RW5jcnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmlu
-Z2VycHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDcz
-YWMgNGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBP
-ZmZpY2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24g
-NDA5Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5
-LTA2LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4
-MDEgZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected20
-MS4gdGFnICYgMHgzZgoyLiBsZW4KCm9uZSBwYXNzICh0YWcgNCkKPT09PT09PT0K
-YiB2ZXJzaW9uOjMKYiBzaWcgdHlwZQpiIGhhc2ggYWxnCmIgcHVia2V5IGFsZwo4
-YiBrZXlpZAoKbGl0ZXJhbCBkYXRhICh0YWcgMTEpCj09PT09PT09PT09PT0KYiBi
-aW5hcnkvdGV4dApiIGxlbmd0aApjIHN0cmluZwpMIG10aW1lCnRleHQK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected21
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBUdWUgTWF5IDMxIDIzOjI5
-OjEwIDIwMTYKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu
-KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1
-IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1
-aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz
-LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu
-b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v
-cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j
-b20+Cgo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected22
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBTdW4gU2VwIDMwIDEwOjUw
-OjIwIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu
-KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1
-IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1
-aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz
-LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu
-b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v
-cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j
-b20+Cgo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected23
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBXZWQgU2VwIDE5IDA3OjUz
-OjE4IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWduKSAw
-NjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJi
-ZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQg
-ICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v
-ZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQg
-b3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAx
-OS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIg
-MDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected24
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gU2VwIDEwIDAwOjE1
-OjM4IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu
-KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1
-IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1
-aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz
-LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu
-b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v
-cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j
-b20+Cgo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected25
-R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfUkMxX2hhc2hlcy5ncGcgbWFk
-ZSBUdWUgT2N0IDE2IDA4OjEyOjE2IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAo
-RW5jcnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmlu
-Z2VycHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDcz
-YWMgNGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBP
-ZmZpY2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24g
-NDA5Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5
-LTA2LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4
-MDEgZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected26
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBUdWUgT2N0IDE2IDA4OjEy
-OjE2IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWduKSAw
-NjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJi
-ZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQg
-ICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v
-ZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQg
-b3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAx
-OS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIg
-MDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected27
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gT2N0IDE1IDA5OjI4
-OjU0IDIwMTIKc2lnbmF0dXJlICAgICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWdu
-KSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQgICBkZGVl
-IDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1
-aWQgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v
-ZmZpY2VyQE5ldEJTRC5vcmc+Cgo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected28
-R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfaGFzaGVzLmFzYyBtYWRlIE1v
-biBPY3QgMTUgMDk6Mjg6NTQgMjAxMgpzaWduYXR1cmUgICAgIDQwOTYvUlNBIChF
-bmNyeXB0IG9yIFNpZ24pIDA2NDk3M2FjNGM0YTcwNmUgMjAwOS0wNi0yMwpmaW5n
-ZXJwcmludCAgIGRkZWUgMmJkYiA5Yzk4IGEwZDEgZDRmYiBkYmY3IDA2NDkgNzNh
-YyA0YzRhIDcwNmUgCnVpZCAgICAgICAgICAgTmV0QlNEIFNlY3VyaXR5IE9mZmlj
-ZXIgPHNlY3VyaXR5LW9mZmljZXJATmV0QlNELm9yZz4KCg==
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected29
-R29vZCBzaWduYXR1cmUgZm9yIE5ldEJTRC02LjBfUkMxX2hhc2hlc19hc2NpaS5n
-cGcgbWFkZSBTdW4gU2VwICA5IDE3OjQxOjI0IDIwMTIKc2lnbmF0dXJlICA0MDk2
-L1JTQSAoRW5jcnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYt
-MjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAw
-NjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1
-cml0eSBPZmZpY2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5
-cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYy
-MCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAx
-OTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIw
-IAoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected30
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBTdW4gU2VwICA5IDE3OjQx
-OjI0IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5jcnlwdCBvciBTaWduKSAw
-NjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2VycHJpbnQ6ICBkZGVlIDJi
-ZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMgNGM0YSA3MDZlIAp1aWQg
-ICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZpY2VyIDxzZWN1cml0eS1v
-ZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5Ni9SU0EgKEVuY3J5cHQg
-b3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2LTIzIFtFeHBpcnkgMjAx
-OS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEgZmJkOCBmNDVkIDg5ZjIg
-MDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected31
-UFJPRz1wClNSQ1M9cGFyc2UuYwpXQVJOUz01Ck1LTUFOPW5vCkNQUEZMQUdTKz0t
-ZyAtTzAKTERGTEFHUys9LWcgLU8wCgouaW5jbHVkZSA8YnNkLnByb2cubWs+Cgp0
-OiAke1BST0d9CgkuLyR7UFJPR30gZ3Bnc2lnbmVkLWEuZ3BnClBST0c9cApTUkNT
-PXBhcnNlLmMKV0FSTlM9NQpNS01BTj1ubwpDUFBGTEFHUys9LWcgLU8wCkxERkxB
-R1MrPS1nIC1PMAoKLmluY2x1ZGUgPGJzZC5wcm9nLm1rPgoKdDogJHtQUk9HfQoJ
-Li8ke1BST0d9IGdwZ3NpZ25lZC1hLmdwZwpQUk9HPXAKU1JDUz1wYXJzZS5jCldB
-Uk5TPTUKTUtNQU49bm8KQ1BQRkxBR1MrPS1nIC1PMApMREZMQUdTKz0tZyAtTzAK
-Ci5pbmNsdWRlIDxic2QucHJvZy5taz4KCnQ6ICR7UFJPR30KCS4vJHtQUk9HfSBn
-cGdzaWduZWQtYS5ncGcK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected32
-R29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAwMDoxNToz
-OCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2lnbikg
-MWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQxNSA5
-ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAKdWlk
-ICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29rcy5j
-b20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3JjLm9y
-Zz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qub3Jn
-Pgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXguY29t
-PgoKR29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAwMDox
-NTozOCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3IgU2ln
-bikgMWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAgZDQx
-NSA5ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgyMyAK
-dWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNyb29r
-cy5jb20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtnc3Jj
-Lm9yZz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRic2Qu
-b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZsaXgu
-Y29tPgoKR29vZCBzaWduYXR1cmUgZm9yIGIuZ3BnIG1hZGUgTW9uIFNlcCAxMCAw
-MDoxNTozOCAyMDEyCnNpZ25hdHVyZSAgICAgMjA0OC9SU0EgKEVuY3J5cHQgb3Ig
-U2lnbikgMWI2OGRjZmNjMDU5NjgyMyAyMDA0LTAxLTEyCmZpbmdlcnByaW50ICAg
-ZDQxNSA5ZGViIDMzNmQgZTRjYyBjZGZhIDAwY2QgMWI2OCBkY2ZjIGMwNTkgNjgy
-MyAKdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BhbGlzdGFpcmNy
-b29rcy5jb20+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAcGtn
-c3JjLm9yZz4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0BuZXRi
-c2Qub3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGZs
-aXguY29tPgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected33
-UFJPRz1wClNSQ1M9cGFyc2UuYwpXQVJOUz01Ck1LTUFOPW5vCkNQUEZMQUdTKz0t
-ZyAtTzAKTERGTEFHUys9LWcgLU8wCgouaW5jbHVkZSA8YnNkLnByb2cubWs+Cgp0
-OiAke1BST0d9CgkuLyR7UFJPR30gZ3Bnc2lnbmVkLWEuZ3BnCjEuIHRhZyAmIDB4
-M2YKMi4gbGVuCgpvbmUgcGFzcyAodGFnIDQpCj09PT09PT09CmIgdmVyc2lvbjoz
-CmIgc2lnIHR5cGUKYiBoYXNoIGFsZwpiIHB1YmtleSBhbGcKOGIga2V5aWQKCmxp
-dGVyYWwgZGF0YSAodGFnIDExKQo9PT09PT09PT09PT09CmIgYmluYXJ5L3RleHQK
-YiBsZW5ndGgKYyBzdHJpbmcKTCBtdGltZQp0ZXh0ClBST0c9cApTUkNTPXBhcnNl
-LmMKV0FSTlM9NQpNS01BTj1ubwpDUFBGTEFHUys9LWcgLU8wCkxERkxBR1MrPS1n
-IC1PMAoKLmluY2x1ZGUgPGJzZC5wcm9nLm1rPgoKdDogJHtQUk9HfQoJLi8ke1BS
-T0d9IGdwZ3NpZ25lZC1hLmdwZwo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected34
-R29vZCBzaWduYXR1cmUgZm9yIGRldC5zaWcgbWFkZSBUaHUgT2N0IDE4IDAyOjEy
-OjMzIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L1JTQSAoRW5jcnlwdCBvciBTaWdu
-KSAxYjY4ZGNmY2MwNTk2ODIzIDIwMDQtMDEtMTIKZmluZ2VycHJpbnQgICBkNDE1
-IDlkZWIgMzM2ZCBlNGNjIGNkZmEgMDBjZCAxYjY4IGRjZmMgYzA1OSA2ODIzIAp1
-aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQGFsaXN0YWlyY3Jvb2tz
-LmNvbT4KdWlkICAgICAgICAgICBBbGlzdGFpciBDcm9va3MgPGFnY0Bwa2dzcmMu
-b3JnPgp1aWQgICAgICAgICAgIEFsaXN0YWlyIENyb29rcyA8YWdjQG5ldGJzZC5v
-cmc+CnVpZCAgICAgICAgICAgQWxpc3RhaXIgQ3Jvb2tzIDxhZ2NAbmV0ZmxpeC5j
-b20+Cgo=
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected35
-VG8gRG8KPT09PT0KdGVzdHMgd2l0aCAtayBzaWcKZGV0YWNoZWQgc2lncwpEU0EK
-CkRvbmUKPT09PQpiYXNpY3MKbG9jYWxpc2UgcGdwX3JlYWRfcGFja2V0cwpmaXgg
-bGludApXQVJOUz01CmxpYiBtYW4gcGFnZQpwcm9nIG1hbiBwYWdlCmRvIHdlIGRv
-IGl0IHN0YXRpY2FsbHkgbGlua2VkIGFzIHdlbGw/Cm11bHRpcGxlIGZpbGVzIGlu
-IG5ldHBncHZlcmlmeQo=
-====
-EOF
- atf_check -s eq:0 -o file:expected16 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify b.gpg
- atf_check -s eq:0 -o file:expected18 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify a.gpg
-# atf_check -s eq:0 -o file:expected19 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify NetBSD-6.0_RC2_hashes.asc
- atf_check -s eq:0 -o file:expected20 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat jj.asc
- atf_check -s eq:0 -o file:expected21 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < a.gpg
- atf_check -s eq:0 -o file:expected22 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < jj.asc
-# atf_check -s eq:0 -o file:expected23 -e empty env TZ=US/Pacific netpgpverify < NetBSD-6.0_RC2_hashes.asc
- atf_check -s eq:0 -o file:expected24 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < b.gpg
- #atf_check -s eq:0 -o file:expected25 -e empty netpgpverify NetBSD-6.0_RC1_hashes.gpg
- #atf_check -s eq:0 -o file:expected26 -e empty netpgpverify < NetBSD-6.0_RC1_hashes.gpg
- atf_check -s eq:0 -o file:expected27 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < NetBSD-6.0_hashes.asc
- atf_check -s eq:0 -o file:expected28 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg NetBSD-6.0_hashes.asc
- #atf_check -s eq:0 -o file:expected29 -e empty netpgpverify NetBSD-6.0_RC1_hashes_ascii.gpg
- #atf_check -s eq:0 -o file:expected30 -e empty netpgpverify < NetBSD-6.0_RC1_hashes_ascii.gpg
- atf_check -s eq:0 -o file:expected31 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg b.gpg b.gpg
- atf_check -s eq:0 -o file:expected32 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg b.gpg b.gpg b.gpg
- atf_check -s eq:0 -o file:expected33 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg jj.asc b.gpg
- atf_check -s eq:0 -o file:expected34 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg det.sig
- atf_check -s eq:0 -o file:expected35 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat det.sig
- #atf_check -s eq:0 -o file:expected46 -e empty netpgpverify -k problem-pubring.gpg NetBSD-6.0_hashes.asc
+ data=$(atf_get_srcdir)/data
+ gzcat ${data}/NetBSD-6.0_hashes.asc.gz > NetBSD-6.0_hashes.asc
+ # expected output contains full file names, so we need the input files locally
+ for i in pubring.gpg b.gpg a.gpg jj.asc det det.sig
+ do
+ cp ${data}/${i} .
+ done
+
+ atf_check -s exit:0 -o file:${data}/expected16 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify b.gpg
+ atf_check -s exit:0 -o file:${data}/expected18 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify a.gpg
+# atf_check -s exit:0 -o file:${data}/expected19 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c verify NetBSD-6.0_hashes.asc
+ atf_check -s exit:0 -o file:${data}/expected20 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat jj.asc
+ atf_check -s exit:0 -o file:${data}/expected21 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < a.gpg
+ atf_check -s exit:0 -o file:${data}/expected22 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < jj.asc
+# atf_check -s exit:0 -o file:${data}/expected23 -e empty env TZ=US/Pacific netpgpverify < NetBSD-6.0_hashes.asc
+ atf_check -s exit:0 -o file:${data}/expected24 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < b.gpg
+ #atf_check -s exit:0 -o file:${data}/expected25 -e empty netpgpverify NetBSD-6.0_hashes.gpg
+ #atf_check -s exit:0 -o file:${data}/expected26 -e empty netpgpverify < NetBSD-6.0_hashes.gpg
+ atf_check -s exit:0 -o file:${data}/expected27 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg < NetBSD-6.0_hashes.asc
+ atf_check -s exit:0 -o file:${data}/expected28 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg NetBSD-6.0_hashes.asc
+ #atf_check -s exit:0 -o file:${data}/expected29 -e empty netpgpverify NetBSD-6.0_hashes_ascii.gpg
+ #atf_check -s exit:0 -o file:${data}/expected30 -e empty netpgpverify < NetBSD-6.0_hashes_ascii.gpg
+ atf_check -s exit:0 -o file:${data}/expected31 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg b.gpg b.gpg
+ atf_check -s exit:0 -o file:${data}/expected32 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg b.gpg b.gpg b.gpg
+ atf_check -s exit:0 -o file:${data}/expected33 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat b.gpg jj.asc b.gpg
+ atf_check -s exit:0 -o file:${data}/expected34 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg det.sig
+ atf_check -s exit:0 -o file:${data}/expected35 -e empty env TZ=US/Pacific netpgpverify -k pubring.gpg -c cat det.sig
+ #atf_check -s exit:0 -o file:${data}/expected46 -e empty netpgpverify -k problem-pubring.gpg NetBSD-6.0_hashes.asc
}
# Test set 2 (dsa_signatures) for netpgpverify
@@ -7222,206 +88,53 @@ netpgpverify_testset_2_dsa_signatures_head() {
atf_set "descr" "Test set 2 (dsa_signatures) for netpgpverify"
}
netpgpverify_testset_2_dsa_signatures_body() {
- uudecode << EOF
-begin-base64 644 dsa-pubring.gpg
-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
-OTZKjAvuLXkOVnawAgAD
-====
-EOF
- uudecode << EOF
-begin-base64 644 in1.gpg
-owGbwMvMwCGoZv+8NenRnzrGNY1JzJl5hgGthk+VOfX8Ukucgl2sFHwTs1PTMnNS
-dcoUDPVM9QwN9AwVjAwMjfQNTPUNzBQMLawMTawMzRQS05MVXCsKFPS4uIJDnVw8
-g7RtOXMykxT0wh09QxBCSZl5XFx6mXnJOaUpqQo2ScUpesWlSSmZRXq52XZcHXEs
-DIIcDGysTCBXMHBxCsBct0iSkWHa0k9iZ5i+mtQ43zvsb7nA9sWeSrvwubEbQw0P
-MNe3Vuky/C+59v/fFbGv5ofnzRSY/ld6vkfIxCtxoVEnvHZVrZeeb60BAA==
-====
-EOF
- uudecode << EOF
-begin-base64 644 in1.asc
-LS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLQpIYXNoOiBTSEEyNTYK
-CiMJLk5ldEJTRDogTWFrZWZpbGUsdiAxLjUuMTAuMSAyMDEyLzA1LzA2IDE4OjE0
-OjE2IGFnYyBFeHAgLgoKU1VCRElSKz0JbGliIC5XQUlUClNVQkRJUis9CWJpbgoK
-LmluY2x1ZGUgPGJzZC5zdWJkaXIubWs+Ci0tLS0tQkVHSU4gUEdQIFNJR05BVFVS
-RS0tLS0tClZlcnNpb246IEdudVBHIHYxLjQuMTEgKE5ldEJTRCkKCmlGNEVBUkVJ
-QUFZRkFsQ0ZNZFlBQ2drUUpqL25oV0xpL0g3Q2tRRUFnRFFyRndQRDc2SkMrNkZu
-T0tFei85RFAKSDdXalJSTW9JUU5UR0MzWlhSc0EvMXhhaDhlRmVQUURtVE8xc1FH
-bklOYmdYOXZaN0dBRk9nVGpXNyt0VmI3SAo9d3RLYgotLS0tLUVORCBQR1AgU0lH
-TkFUVVJFLS0tLS0K
-====
-EOF
- uudecode << EOF
-begin-base64 644 in2.gpg
-owGbwMvMwCGoZv+8NenRnzrGNU1JzJl5RgGtHj+VOfX8Ukucgl2sFHwTs1PTMnNS
-dcoUDPVM9QwN9AwVjAwMjfQNTPUNzBQMLawMTawMzRQS05MVXCsKFPQUuLiCQ51c
-PIO0bTlzMpMU9MIdPUMQQkmZeVxcepl5yTmlKakKNknFKXrFpUkpmUV6udl2XB1x
-LAyCHAxsrEwgZzBwcQrAnFfzjeGv9GtuvQj7X/Kv5IQ8f2s9n/36yaOmu9HPs8/V
-8pg+SdfaxMhwdEOjtLVOGtuaizmXnJ8oa4fN/bfL0WfP1smOn38vsLFlBQA=
-====
-EOF
- uudecode << EOF
-begin-base64 644 in2.asc
-LS0tLS1CRUdJTiBQR1AgU0lHTkVEIE1FU1NBR0UtLS0tLQpIYXNoOiBTSEEyNTYK
-CiMJLk5ldEJTRDogTWFrZWZpbGUsdiAxLjUuMTAuMSAyMDEyLzA1LzA2IDE4OjE0
-OjE2IGFnYyBFeHAgLiAKClNVQkRJUis9CWxpYiAuV0FJVApTVUJESVIrPQliaW4K
-Ci5pbmNsdWRlIDxic2Quc3ViZGlyLm1rPgotLS0tLUJFR0lOIFBHUCBTSUdOQVRV
-UkUtLS0tLQpWZXJzaW9uOiBHbnVQRyB2MS40LjExIChOZXRCU0QpCgppRjRFQVJF
-SUFBWUZBbENGU1FvQUNna1FKai9uaFdMaS9INmFLQUQ5SENMVHdZOEN3aXFUWHJ6
-S3hIWjVsSFFuCnFFWmJjYlhqa0N4bGsrbS9QSFVBLzJXaGxjMHQ1WnRtSTIyMUxR
-eTVpblRuenB1MVU3NUU1bEp2dzBZTVRkWEoKPXY3ODgKLS0tLS1FTkQgUEdQIFNJ
-R05BVFVSRS0tLS0tCg==
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected36
-R29vZCBzaWduYXR1cmUgZm9yIGluMS5ncGcgbWFkZSBNb24gT2N0IDIyIDA0OjQ1
-OjQxIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl
-IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj
-OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk
-IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu
-Y29tPgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected37
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gT2N0IDIyIDA0OjQ1
-OjQxIDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl
-IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj
-OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk
-IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu
-Y29tPgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected38
-R29vZCBzaWduYXR1cmUgZm9yIGluMS5hc2MgbWFkZSBNb24gT2N0IDIyIDA0OjQ1
-OjI2IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl
-IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj
-OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk
-IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu
-Y29tPgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected39
-R29vZCBzaWduYXR1cmUgZm9yIFtzdGRpbl0gbWFkZSBNb24gT2N0IDIyIDA0OjQ1
-OjI2IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl
-IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj
-OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk
-IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu
-Y29tPgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected40
-IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6
-MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou
-aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected41
-IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6
-MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou
-aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected42
-IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6
-MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou
-aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected43
-IwkuTmV0QlNEOiBNYWtlZmlsZSx2IDEuNS4xMC4xIDIwMTIvMDUvMDYgMTg6MTQ6
-MTYgYWdjIEV4cCAuCgpTVUJESVIrPQlsaWIgLldBSVQKU1VCRElSKz0JYmluCgou
-aW5jbHVkZSA8YnNkLnN1YmRpci5taz4K
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected44
-R29vZCBzaWduYXR1cmUgZm9yIGluMi5ncGcgbWFkZSBNb24gT2N0IDIyIDA2OjI0
-OjA5IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl
-IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj
-OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk
-IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu
-Y29tPgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected45
-R29vZCBzaWduYXR1cmUgZm9yIGluMi5hc2MgbWFkZSBNb24gT2N0IDIyIDA2OjI0
-OjI2IDIwMTIKc2lnbmF0dXJlICAgICAyMDQ4L0RTQSAyNjNmZTc4NTYyZTJmYzdl
-IDIwMTItMTAtMjEKZmluZ2VycHJpbnQgICBkMmU1IDA3YjYgNWQ1OSAzM2QzIDlj
-OGQgYTYxOCAyNjNmIGU3ODUgNjJlMiBmYzdlIAp1aWQgICAgICAgICAgIERhdmlk
-IEFybXN0cm9uZyAoVGVzdCBEU0Ega2V5IC0gZG8gbm90IHVzZSkgPGRzYUBkc2Eu
-Y29tPgoK
-====
-EOF
- uudecode << EOF
-begin-base64 644 expected46
-SWdub3JpbmcgdW51c3VhbC9yZXNlcnZlZCBzaWduYXR1cmUgc3VicGFja2V0IDE4
-Ckdvb2Qgc2lnbmF0dXJlIGZvciBOZXRCU0QtNi4wX2hhc2hlcy5hc2MgbWFkZSBN
-b24gT2N0IDE1IDA5OjI4OjU0IDIwMTIKc2lnbmF0dXJlICA0MDk2L1JTQSAoRW5j
-cnlwdCBvciBTaWduKSAwNjQ5NzNhYzRjNGE3MDZlIDIwMDktMDYtMjMKZmluZ2Vy
-cHJpbnQ6ICBkZGVlIDJiZGIgOWM5OCBhMGQxIGQ0ZmIgZGJmNyAwNjQ5IDczYWMg
-NGM0YSA3MDZlIAp1aWQgICAgICAgICAgICAgIE5ldEJTRCBTZWN1cml0eSBPZmZp
-Y2VyIDxzZWN1cml0eS1vZmZpY2VyQE5ldEJTRC5vcmc+CmVuY3J5cHRpb24gNDA5
-Ni9SU0EgKEVuY3J5cHQgb3IgU2lnbikgOWZmMmMyNGZkZjJjZTYyMCAyMDA5LTA2
-LTIzIFtFeHBpcnkgMjAxOS0wNi0yMV0KZmluZ2VycHJpbnQ6ICAxOTE1IDA4MDEg
-ZmJkOCBmNDVkIDg5ZjIgMDIwNSA5ZmYyIGMyNGYgZGYyYyBlNjIwIAoK
-====
-EOF
- atf_check -s eq:0 -o file:expected36 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.gpg
- atf_check -s eq:0 -o file:expected37 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.gpg
- atf_check -s eq:0 -o file:expected38 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.asc
- atf_check -s eq:0 -o file:expected39 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.asc
- atf_check -s eq:0 -o file:expected40 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.gpg
- atf_check -s eq:0 -o file:expected41 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.gpg
- atf_check -s eq:0 -o file:expected42 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.asc
- atf_check -s eq:0 -o file:expected43 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.asc
- atf_check -s eq:0 -o file:expected44 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.gpg
- atf_check -s eq:0 -o file:expected45 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.asc
+ data=$(atf_get_srcdir)/data
+ for i in dsa-pubring.gpg in1.gpg in1.asc in2.gpg in2.asc
+ do
+ cp ${data}/${i} .
+ done
+
+ atf_check -s exit:0 -o file:${data}/expected36 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.gpg
+ atf_check -s exit:0 -o file:${data}/expected37 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.gpg
+ atf_check -s exit:0 -o file:${data}/expected38 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in1.asc
+ atf_check -s exit:0 -o file:${data}/expected39 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg < in1.asc
+ atf_check -s exit:0 -o file:${data}/expected40 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.gpg
+ atf_check -s exit:0 -o file:${data}/expected41 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.gpg
+ atf_check -s exit:0 -o file:${data}/expected42 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat in1.asc
+ atf_check -s exit:0 -o file:${data}/expected43 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg -c cat < in1.asc
+ atf_check -s exit:0 -o file:${data}/expected44 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.gpg
+ atf_check -s exit:0 -o file:${data}/expected45 -e empty env TZ=US/Pacific netpgpverify -k dsa-pubring.gpg in2.asc
+}
+
+# Test set 3 - test signatures made by GnuPG v1 and v2
+atf_test_case netpgpverify_testset_3_gnupg_version_signatures
+
+netpgpverify_testset_3_gnupg_version_signatures_head() {
+ atf_set "descr" "Test set 3 (signatures by GnuPG v1 and v2) for netpgpverify"
+}
+
+netpgpverify_testset_3_gnupg_version_signatures_body() {
+ atf_expect_fail "PR bin/59936 - does not support signatures generated by gnugp2"
+ data=$(atf_get_srcdir)/data
+ for i in message message.v1.asc message.v1.sig message.v2.asc message.v2.sig
+ do
+ cp ${data}/${i} .
+ done
+ ln -s message message.v1
+ ln -s message message.v2
+
+ # signature made by GnuPG 1.x
+ atf_check -s exit:0 -o file:${data}/message.v1.asc.expected -e empty env TZ=Europe/Vienna netpgpverify -k ${data}/message.keyring message.v1.asc
+ atf_check -s exit:0 -o file:${data}/message.v1.sig.expected -e empty env TZ=Europe/Vienna netpgpverify -k ${data}/message.keyring message.v1.sig
+ # signature made by GnuPG 2.x
+ atf_check -s exit:0 -o file:${data}/message.v2.asc.expected -e empty env TZ=Europe/Vienna netpgpverify -k ${data}/message.keyring message.v2.asc
+ atf_check -s exit:0 -o file:${data}/message.v2.sig.expected -e empty env TZ=Europe/Vienna netpgpverify -k ${data}/message.keyring message.v2.sig
}
# all test sets
atf_init_test_cases() {
atf_add_test_case netpgpverify_testset_1_rsa_signatures
atf_add_test_case netpgpverify_testset_2_dsa_signatures
+ atf_add_test_case netpgpverify_testset_3_gnupg_version_signatures
}
diff --git a/usr.bin/sdiff/t_sdiff.sh b/usr.bin/sdiff/t_sdiff.sh
index 2d6fc2dcc882..3d70c4a38a75 100644
--- a/usr.bin/sdiff/t_sdiff.sh
+++ b/usr.bin/sdiff/t_sdiff.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_sdiff.sh,v 1.1 2012/03/17 16:33:15 jruoho Exp $
+# $NetBSD: t_sdiff.sh,v 1.2 2024/04/28 07:27:43 rillig Exp $
#
# Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -32,13 +32,13 @@ flags_head()
}
flags_body()
{
- atf_check -o file:$(atf_get_srcdir)/d_flags_l.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_flags_l.out -s exit:1 \
sdiff -l "$(atf_get_srcdir)/d_input1" "$(atf_get_srcdir)/d_input2"
- atf_check -o file:$(atf_get_srcdir)/d_flags_s.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_flags_s.out -s exit:1 \
sdiff -s "$(atf_get_srcdir)/d_input1" "$(atf_get_srcdir)/d_input2"
- atf_check -o file:$(atf_get_srcdir)/d_flags_w.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_flags_w.out -s exit:1 \
sdiff -w 125 "$(atf_get_srcdir)/d_input1" "$(atf_get_srcdir)/d_input2"
}
@@ -52,14 +52,14 @@ iflags_body()
tail1="-w 125 -I .*filename.* $(atf_get_srcdir)/d_input1 $(atf_get_srcdir)/d_input2"
tail2="-w 125 -I .*filename.* $(atf_get_srcdir)/d_input2 $(atf_get_srcdir)/d_input1"
- atf_check -o file:$(atf_get_srcdir)/d_iflags_a1.out -s eq:1 sdiff ${tail1}
- atf_check -o file:$(atf_get_srcdir)/d_iflags_a2.out -s eq:1 sdiff ${tail2}
- atf_check -o file:$(atf_get_srcdir)/d_iflags_b1.out -s eq:1 sdiff -s ${tail1}
- atf_check -o file:$(atf_get_srcdir)/d_iflags_b2.out -s eq:1 sdiff -s ${tail2}
- atf_check -o file:$(atf_get_srcdir)/d_iflags_c1.out -s eq:1 sdiff -l ${tail1}
- atf_check -o file:$(atf_get_srcdir)/d_iflags_c2.out -s eq:1 sdiff -l ${tail2}
- atf_check -o file:$(atf_get_srcdir)/d_iflags_d1.out -s eq:1 sdiff -s ${tail1}
- atf_check -o file:$(atf_get_srcdir)/d_iflags_d2.out -s eq:1 sdiff -s ${tail2}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_a1.out -s exit:1 sdiff ${tail1}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_a2.out -s exit:1 sdiff ${tail2}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_b1.out -s exit:1 sdiff -s ${tail1}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_b2.out -s exit:1 sdiff -s ${tail2}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_c1.out -s exit:1 sdiff -l ${tail1}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_c2.out -s exit:1 sdiff -l ${tail2}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_d1.out -s exit:1 sdiff -s ${tail1}
+ atf_check -o file:$(atf_get_srcdir)/d_iflags_d2.out -s exit:1 sdiff -s ${tail2}
}
atf_test_case tabs
@@ -69,7 +69,7 @@ tabs_head()
}
tabs_body()
{
- atf_check -o file:$(atf_get_srcdir)/d_tabs.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_tabs.out -s exit:1 \
sdiff "$(atf_get_srcdir)/d_tabs1.in" "$(atf_get_srcdir)/d_tabs2.in"
}
@@ -80,13 +80,13 @@ tabends_head()
}
tabends_body()
{
- atf_check -o file:$(atf_get_srcdir)/d_tabends_a.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_tabends_a.out -s exit:1 \
sdiff -w30 "$(atf_get_srcdir)/d_tabends.in" /dev/null
- atf_check -o file:$(atf_get_srcdir)/d_tabends_b.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_tabends_b.out -s exit:1 \
sdiff -w30 /dev/null "$(atf_get_srcdir)/d_tabends.in"
- atf_check -o file:$(atf_get_srcdir)/d_tabends_c.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_tabends_c.out -s exit:1 \
sdiff -w19 "$(atf_get_srcdir)/d_tabends.in" /dev/null
}
@@ -142,10 +142,10 @@ oneline_head()
}
oneline_body()
{
- atf_check -o file:$(atf_get_srcdir)/d_oneline_a.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_oneline_a.out -s exit:1 \
sdiff /dev/null "$(atf_get_srcdir)/d_oneline.in"
- atf_check -o file:$(atf_get_srcdir)/d_oneline_b.out -s eq:1 \
+ atf_check -o file:$(atf_get_srcdir)/d_oneline_b.out -s exit:1 \
sdiff "$(atf_get_srcdir)/d_oneline.in" /dev/null
}
@@ -157,10 +157,10 @@ dot_head()
dot_body()
{
echo ". <" > expout
- atf_check -o file:expout -s eq:1 sdiff "$(atf_get_srcdir)/d_dot.in" /dev/null
+ atf_check -o file:expout -s exit:1 sdiff "$(atf_get_srcdir)/d_dot.in" /dev/null
echo " > ." > expout
- atf_check -o file:expout -s eq:1 sdiff /dev/null "$(atf_get_srcdir)/d_dot.in"
+ atf_check -o file:expout -s exit:1 sdiff /dev/null "$(atf_get_srcdir)/d_dot.in"
}
atf_test_case stdin
@@ -171,11 +171,11 @@ stdin_head()
stdin_body()
{
echo " > stdin" > expout
- atf_check -o file:expout -s eq:1 -x \
+ atf_check -o file:expout -s exit:1 -x \
"echo stdin | sdiff /dev/null /dev/stdin"
echo "stdin <" > expout
- atf_check -o file:expout -s eq:1 -x \
+ atf_check -o file:expout -s exit:1 -x \
"echo stdin | sdiff /dev/stdin /dev/null"
}
diff --git a/usr.bin/sed/t_sed.sh b/usr.bin/sed/t_sed.sh
index 0f18a75640a6..5d12282b3f1d 100644
--- a/usr.bin/sed/t_sed.sh
+++ b/usr.bin/sed/t_sed.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_sed.sh,v 1.11 2023/05/06 02:12:11 gutteridge Exp $
+# $NetBSD: t_sed.sh,v 1.15 2025/06/03 19:03:23 martin Exp $
#
# Copyright (c) 2012 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -137,12 +137,34 @@ escapes_in_subst_head() {
}
escapes_in_subst_body() {
+ # basic tests
atf_check -o inline:"fooXbar\n" \
-x 'echo "foo bar" | sed -e "s/ /\x58/"'
atf_check -o inline:"fooXbar\n" \
-x 'echo "foo bar" | sed -e "s/ /\o130/"'
atf_check -o inline:"fooXbar\n" \
-x 'echo "foo bar" | sed -e "s/ /\d88/"'
+
+ # overflowing the escaped char value
+ # atf_expect_fail "PR bin/59453: sed misparses \[dox]number escapes"
+ atf_check -o inline:"#8ball\n" \
+ -x "echo | sed -e 's/^/\d358ball/'"
+
+ atf_check -o inline:"#3duh\n" \
+ -x "echo | sed -e 's/^/\o0433duh/'"
+
+ atf_check -o inline:"#duh\n" \
+ -x "echo | sed -e 's/^/\x23duh/'"
+
+ # check that escapes end after 2 or 3 chars
+ atf_check -o inline:"00000000 09 38 62 61 6c 6c 0a |.8ball.|\n" \
+ -x "echo | sed -e 's/^/\d0098ball/' | hexdump -C | head -1"
+
+ atf_check -o inline:"00000000 07 37 62 61 6c 6c 0a |.7ball.|\n" \
+ -x "echo | sed -e 's/^/\o0077ball/' | hexdump -C | head -1"
+
+ atf_check -o inline:"00000000 01 38 62 61 6c 6c 0a |.8ball.|\n" \
+ -x "echo | sed -e 's/^/\x018ball/' | hexdump -C | head -1"
}
atf_test_case escapes_in_re
diff --git a/usr.bin/tar/Makefile b/usr.bin/tar/Makefile
index 36a75c01c3d0..758fe9f3fc74 100644
--- a/usr.bin/tar/Makefile
+++ b/usr.bin/tar/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.4 2020/01/19 17:36:57 christos Exp $
+# $NetBSD: Makefile,v 1.5 2024/06/10 07:31:51 kre Exp $
NOMAN=
@@ -119,3 +119,6 @@ CLEANFILES+=list.h
list.h: ${SRCS.h_tar} Makefile
${TOOL_GREP} -h '^DEFINE_TEST(' ${.ALLSRC} > ${.TARGET}
+
+COPTS.test_main.c+= ${CC_WNO_STRINGOP_OVERFLOW}
+COPTS.test_option_b.c+= ${CC_WNO_STRINGOP_OVERFLOW}
diff --git a/usr.bin/xlint/lint1/Makefile b/usr.bin/xlint/lint1/Makefile
index 8a21998f18be..684328f7e37f 100644
--- a/usr.bin/xlint/lint1/Makefile
+++ b/usr.bin/xlint/lint1/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.141 2023/04/23 08:47:27 rillig Exp $
+# $NetBSD: Makefile,v 1.142 2024/06/08 09:09:20 rillig Exp $
NOMAN= # defined
@@ -20,6 +20,38 @@ FILESDIR= ${TESTSDIR}
FILES+= ${:!cd ${.CURDIR} && echo *.c *.exp-ln!}
FILES+= check-expect.lua
+add-test: .PHONY
+ @set -eu; \
+ test=${NAME:Q}; \
+ [ "$$test" ] || { \
+ echo "usage: ${MAKE} add-test NAME=<name>"; \
+ exit; \
+ }; \
+ \
+ if [ -f "$$test.c" ]; then \
+ echo "error: test $$test already exists in $$PWD."; \
+ exit 1; \
+ fi; \
+ \
+ echo "=> Adding test $$test"; \
+ printf '%s\n' \
+ '/* $$''NetBSD$$ */' \
+ "# 3 \"$$test.c\"" \
+ '' \
+ '/*' \
+ ' * TODO: Explain the purpose of the test.' \
+ ' */' \
+ '' \
+ '/* lint1-extra-flags: -Z */' \
+ '/* lint1-flags: -Z */' \
+ '/* lint1-only-if: schar uchar ilp32 lp64 int long ldbl64 ldbl96 ldbl128 */' \
+ '' \
+ '// TODO: Add some code that passes.' \
+ '// TODO: Add some code that fails.' \
+ > "$$test.c"; \
+ cvs add "$$test.c"; \
+ ${MAKE} sync-mi
+
# Note: only works for adding tests.
# To remove a test, the $$mi file must be edited manually.
sync-mi: .PHONY
diff --git a/usr.bin/xlint/lint1/accept.sh b/usr.bin/xlint/lint1/accept.sh
index 4a2a752a9fcf..420bcd96e812 100644
--- a/usr.bin/xlint/lint1/accept.sh
+++ b/usr.bin/xlint/lint1/accept.sh
@@ -1,5 +1,5 @@
#! /bin/sh
-# $NetBSD: accept.sh,v 1.14 2023/07/08 10:01:17 rillig Exp $
+# $NetBSD: accept.sh,v 1.18 2025/02/27 06:48:29 rillig Exp $
#
# Copyright (c) 2021 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -26,7 +26,7 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-# usage: accept.sh <pattern>...
+# usage: accept.sh [-u] <pattern>...
#
# Run one or more lint tests, saving their output in the corresponding
# .exp files, for incorporating the messages into the .c files as
@@ -34,6 +34,13 @@
set -eu
+atf_get_srcdir() {
+ echo "."
+}
+atf_test_case() {
+ :
+}
+
: "${archsubdir:=$(make -v ARCHSUBDIR)}"
. './t_integration.sh' # for configure_test_case
@@ -79,7 +86,7 @@ for pattern in "$@"; do
continue
fi
- if [ -f "$exp_file" ] && cmp -s "$exp_tmp_file" "$exp_file"; then
+ if [ -f "$exp_file" ] && cmp -s "$exp_tmp_file" "$exp_file"; then
rm "$exp_tmp_file"
else
mv "$exp_tmp_file" "$exp_file"
@@ -90,7 +97,7 @@ for pattern in "$@"; do
elif [ "$ln_file" = '/dev/null' ]; then
rm "$ln_tmp_file"
else
- if tr -d ' \t' < "$ln_file" > "$ln_file.trimmed.tmp" &&
+ if tr -d ' \t' < "$ln_file" | sed '/^$/d' > "$ln_file.trimmed.tmp" &&
tr -d ' \t' < "$ln_tmp_file" > "$ln_tmp_file.trimmed.tmp" &&
cmp -s "$ln_file.trimmed.tmp" "$ln_tmp_file.trimmed.tmp"; then
rm "$ln_tmp_file"
diff --git a/usr.bin/xlint/lint1/c11.c b/usr.bin/xlint/lint1/c11.c
index b13883325332..4ae04e808c31 100644
--- a/usr.bin/xlint/lint1/c11.c
+++ b/usr.bin/xlint/lint1/c11.c
@@ -1,4 +1,4 @@
-/* $NetBSD: c11.c,v 1.5 2023/08/03 18:48:42 rillig Exp $ */
+/* $NetBSD: c11.c,v 1.13 2026/01/17 14:27:08 rillig Exp $ */
# 3 "c11.c"
/*
@@ -6,7 +6,30 @@
* functions, anonymous struct/union members, and several more.
*/
-/* lint1-flags: -Ac11 -w -X 192,231,236,351 */
+/* lint1-flags: -Ac11 -hw -X 192,231,236,351 */
+
+
+int
+bool_is_predefined_in_c23(void)
+{
+ /* expect+1: error: syntax error 't' [249] */
+ bool t = true;
+ bool f = false;
+ /* expect+4: error: 't' undefined [99] */
+ /* expect+3: error: 'true' undefined [99] */
+ /* expect+2: error: 'f' undefined [99] */
+ /* expect+1: error: 'false' undefined [99] */
+ return (t == true ? 20 : 0) + (f == false ? 3 : 0);
+}
+
+int
+c99_bool_is_still_valid_in_c23(void)
+{
+ _Bool t = 1;
+ _Bool f = 0;
+ return (t == 1 ? 20 : 0) + (f == 0 ? 3 : 0);
+}
+
_Noreturn void exit(int);
void _Noreturn exit(int);
@@ -73,11 +96,9 @@ void fcompat(void)
int (*p)[4][n+1];
int c[n][n][6][m];
int (*r)[n][n][n+1];
- /* expect+2: warning: 'p' set but not used in function 'fcompat' [191] */
- /* expect+1: warning: illegal combination of 'pointer to array[4] of array[1] of int' and 'pointer to array[6] of array[1] of int', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to array[4] of array[1] of int' and 'pointer to array[6] of array[1] of int', op '=' [124] */
p = a;
- /* expect+2: warning: 'r' set but not used in function 'fcompat' [191] */
- /* expect+1: warning: illegal combination of 'pointer to array[1] of array[1] of array[1] of int' and 'pointer to array[1] of array[6] of array[1] of int', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to array[1] of array[1] of array[1] of int' and 'pointer to array[1] of array[6] of array[1] of int', op '=' [124] */
r = c;
}
@@ -101,12 +122,13 @@ void fvla(int m, int C[m][m])
int (*s)[m];
/* expect+1: warning: nested 'extern' declaration of 'r' [352] */
extern int (*r)[m];
- /* expect+2: warning: illegal combination of 'pointer to array[1] of int' and 'pointer to int', op 'init' [124] */
- /* expect+1: warning: 'q' set but not used in function 'fvla' [191] */
+ /* expect+1: warning: invalid combination of 'pointer to array[1] of int' and 'pointer to array[100] of int', op 'init' [124] */
static int (*q)[m] = &B;
}
// C11 6.7.6.3p15
+/* expect+2: warning: function declaration is not a prototype [287] */
+/* expect+1: warning: function declaration is not a prototype [287] */
int f(void), *fip(), (*pfi)();
// C11 6.7.6.3p17
@@ -141,11 +163,37 @@ double maximum(int n, int m, double a[ ][m]);
void f1(double (* restrict a)[5]);
void f2(double a[restrict][5]);
-/* expect+1: error: syntax error '3' [249] */
+/* expect+2: error: syntax error '3' [249] */
+/* expect+1: warning: function declaration is not a prototype [287] */
void f3(double a[restrict 3][5]);
void f4(double a[restrict static 3][5]);
+int _Alignas(double) int_aligned_as_double;
+
+
+// C23 6.7.7.4p13 says that "()" is equivalent to "(void)".
+// In C11 6.7.6.3p14, "()" means "no information about the number of types".
+/* expect+1: warning: function declaration is not a prototype [287] */
+void function_without_parameters();
+
+
+// Ensure that _Alignas is based on alignment, not on struct size.
+struct mem_1024bit {
+ unsigned char data[1024];
+};
+
+struct alignas_type {
+ unsigned alignas_expr _Alignas(128);
+ unsigned alignas_type _Alignas(struct mem_1024bit);
+};
+
+// The member alignas_expr is at offset 0 with alignment 128,
+// and alignas_type is at offset 4 with alignment max(1, 4).
+/* expect+1: error: negative array dimension (-128) [20] */
+typedef int reveal_sizeof_uint_1024[-(int)sizeof(struct alignas_type)];
+
+
// In C11 mode, 'thread_local' is not yet known, but '_Thread_local' is.
/* expect+2: error: old-style declaration; add 'int' [1] */
/* expect+1: error: syntax error 'int' [249] */
@@ -153,8 +201,8 @@ thread_local int thread_local_variable_c23;
_Thread_local int thread_local_variable_c11;
/* The '_Noreturn' must not appear after the declarator. */
+/* expect+2: error: formal parameter #1 lacks name [59] */
+/* expect+1: warning: empty declaration [2] */
void _Noreturn exit(int) _Noreturn;
-/* expect-1: error: formal parameter #1 lacks name [59] */
-/* expect-2: warning: empty declaration [2] */
/* expect+2: error: syntax error '' [249] */
/* expect+1: error: cannot recover from previous errors [224] */
diff --git a/usr.bin/xlint/lint1/c11_generic_expression.c b/usr.bin/xlint/lint1/c11_generic_expression.c
index 6c4b292b70c5..c2b105e96327 100644
--- a/usr.bin/xlint/lint1/c11_generic_expression.c
+++ b/usr.bin/xlint/lint1/c11_generic_expression.c
@@ -1,4 +1,4 @@
-/* $NetBSD: c11_generic_expression.c,v 1.19 2023/08/06 19:44:50 rillig Exp $ */
+/* $NetBSD: c11_generic_expression.c,v 1.23 2026/01/10 08:42:48 rillig Exp $ */
# 3 "c11_generic_expression.c"
/* lint1-extra-flags: -X 351 */
@@ -108,3 +108,31 @@ const char *x = _Generic(
1ULL + 1.0f,
int: 1
);
+
+// Introduced by C11 6.5.2.1.
+// Fixed by C23 6.5.2.1.
+void
+type_conversions(const char *str)
+{
+ int array[4] = { 0, 1, 2, 3 };
+
+ // Type qualifiers are removed in lvalues.
+ x = _Generic(*str,
+ char: str,
+ default: primary_expression
+ );
+ // Type qualifiers are ignored in rvalues.
+ x = _Generic(((const unsigned char)str[2]),
+ unsigned char: str
+ );
+ // Functions are converted to a function pointer.
+ x = _Generic(type_conversions,
+ void(*)(const char *): str,
+ default: primary_expression
+ );
+ // Arrays are converted to the corresponding pointer.
+ x = _Generic(array,
+ int *: str,
+ default: primary_expression
+ );
+}
diff --git a/usr.bin/xlint/lint1/c23.c b/usr.bin/xlint/lint1/c23.c
index 32b7fefb44e8..f400a36e2479 100644
--- a/usr.bin/xlint/lint1/c23.c
+++ b/usr.bin/xlint/lint1/c23.c
@@ -1,4 +1,4 @@
-/* $NetBSD: c23.c,v 1.7 2023/07/28 22:05:44 rillig Exp $ */
+/* $NetBSD: c23.c,v 1.18 2025/09/18 18:22:18 rillig Exp $ */
# 3 "c23.c"
// Tests for the option -Ac23, which allows features from C23 and all earlier
@@ -8,7 +8,62 @@
// c11.c
// msg_353.c for empty initializer braces
-/* lint1-flags: -Ac23 -w -X 351 */
+/* lint1-flags: -Ac23 -hw -X 351 */
+
+
+int
+bool_is_predefined_in_c23(void)
+{
+ bool t = true;
+ bool f = false;
+ return (t == true ? 20 : 0) + (f == false ? 3 : 0);
+}
+
+int
+c99_bool_is_still_valid_in_c23(void)
+{
+ _Bool t = 1;
+ _Bool f = 0;
+ return (t == 1 ? 20 : 0) + (f == 0 ? 3 : 0);
+}
+
+
+bool
+null_pointer_constant(const char *p, double dbl)
+{
+ /* expect+1: error: operands of '!=' have incompatible types 'double' and 'pointer to void' [107] */
+ if (dbl != nullptr)
+ p++;
+ if (dbl > 0.0)
+ p++;
+ if (*p == '\0')
+ p = nullptr;
+ return p == nullptr;
+}
+
+
+void *
+storage_class_in_compound_literal(void)
+{
+ typedef struct node node;
+ struct node {
+ node *left;
+ int value;
+ node *right;
+ };
+
+ node *tree;
+ tree = &(static node){
+ &(static node){
+ nullptr,
+ 3,
+ nullptr,
+ },
+ 5,
+ nullptr,
+ };
+ return tree->left;
+}
int
empty_initializer_braces(void)
@@ -50,7 +105,103 @@ function(void)
// storage classes. The other storage classes cannot be combined.
extern thread_local int extern_thread_local_1;
thread_local extern int extern_thread_local_2;
+/* expect+1: warning: static variable 'static_thread_local_1' unused [226] */
static thread_local int static_thread_local_1;
+/* expect+1: warning: static variable 'static_thread_local_2' unused [226] */
thread_local static int static_thread_local_2;
-/* expect-2: warning: static variable 'static_thread_local_1' unused [226] */
-/* expect-2: warning: static variable 'static_thread_local_2' unused [226] */
+
+
+int
+attributes(int i)
+{
+ // An attribute specifier list may be empty.
+ [[]]i++;
+
+ // There may be leading or trailing commas.
+ [[,]]i++;
+
+ // There may be arbitrary commas around or between the attributes.
+ [[,,,,,]]i++;
+
+ // An attribute may be a plain identifier without arguments.
+ [[identifier]]i++;
+
+ // The identifier may be prefixed with one additional identifier.
+ [[prefix::identifier]]i++;
+
+ // An attribute may have empty arguments.
+ [[identifier()]]i++;
+
+ // The arguments of an attribute may be arbitrary tokens.
+ [[identifier([])]]i++;
+
+ // The commas in this "argument list" are ordinary punctuator tokens,
+ // they do not separate any arguments.
+ // The structure of the attribute argument is:
+ // 1. empty balanced token sequence between '[' and ']'
+ // 2. token ','
+ // 3. empty balanced token sequence between '{' and '}'
+ // 4. token ','
+ // 5. empty balanced token sequence between '(' and ')'
+ [[identifier([], {}, ())]]i++;
+
+ // Inside an argument, parentheses may be nested.
+ [[identifier(((((())))))]]i++;
+ // Inside an argument, brackets may be nested.
+ [[identifier([[[[[]]]]])]]i++;
+ // Inside an argument, braces may be nested.
+ [[identifier({{{{{}}}}})]]i++;
+
+ // An attribute argument may contain arbitrary punctuation.
+ [[identifier(++++ ? ? ? : : :: )]]i++;
+
+ // An attribute argument may contain constants and string literals.
+ [[identifier(0, 0.0, "hello" " " "world")]]i++;
+
+ // There may be multiple attribute specifier sequences in a row.
+ [[]][[]][[]]i++;
+
+ // An attribute may occur more than once.
+ [[
+ maybe_unused, maybe_unused, maybe_unused, maybe_unused,
+ maybe_unused, maybe_unused, maybe_unused, maybe_unused,
+ maybe_unused, maybe_unused, maybe_unused, maybe_unused,
+ maybe_unused, maybe_unused, maybe_unused, maybe_unused,
+ maybe_unused, maybe_unused, maybe_unused, maybe_unused,
+ ]]i++;
+
+ return i;
+}
+
+typedef int number;
+
+void
+attributes_in_parameter_declaration(
+ [[maybe_unused]] int int_param,
+ [[maybe_unused]] const int const_int_param,
+ [[maybe_unused]] number typedef_param,
+ [[maybe_unused]] const number const_typedef_param)
+{
+}
+
+int
+attribute_in_switch_statement(int n)
+{
+ switch (n) {
+ case 1:
+ n++;
+ /* expect+1: warning: fallthrough on case statement [220] */
+ case 2:
+ n++;
+ [[fallthrough]];
+ case 3:
+ n++;
+ [[fallthrough]];
+ default:
+ n++;
+ }
+ return n;
+}
+
+// C23 6.7.7.4p13 says that "()" is equivalent to "(void)".
+void function_without_parameters();
diff --git a/usr.bin/xlint/lint1/c90.c b/usr.bin/xlint/lint1/c90.c
index 3304cec2c1d1..262ba7f9503a 100644
--- a/usr.bin/xlint/lint1/c90.c
+++ b/usr.bin/xlint/lint1/c90.c
@@ -1,4 +1,4 @@
-/* $NetBSD: c90.c,v 1.2 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: c90.c,v 1.4 2024/11/30 11:27:20 rillig Exp $ */
# 3 "c90.c"
/*
@@ -8,5 +8,12 @@
/* lint1-flags: -sw -X 351 */
-/* expect+1: error: ANSI C requires formal parameter before '...' [84] */
+/* expect+1: error: C90 to C17 require formal parameter before '...' [84] */
void varargs_function(...);
+
+int
+compound_literal(void)
+{
+ /* expect+1: error: compound literals are a C99/GCC extension [319] */
+ return (int){123};
+}
diff --git a/usr.bin/xlint/lint1/check-expect.lua b/usr.bin/xlint/lint1/check-expect.lua
index 95ba60267cc8..88f869a6e6f3 100644
--- a/usr.bin/xlint/lint1/check-expect.lua
+++ b/usr.bin/xlint/lint1/check-expect.lua
@@ -1,9 +1,9 @@
-#! /usr/bin/lua
--- $NetBSD: check-expect.lua,v 1.8 2023/08/11 04:27:49 rillig Exp $
+#! /usr/bin/lua
+-- $NetBSD: check-expect.lua,v 1.14 2025/02/27 06:48:29 rillig Exp $
--[[
-usage: lua ./check-expect.lua *.c
+usage: lua ./check-expect.lua [-u] *.c
Check that the /* expect+-n: ... */ comments in the .c source files match the
actual messages found in the corresponding .exp files. The .exp files are
@@ -185,21 +185,35 @@ test(function()
assert_equals(matches("abc123xyz", "...y..."), true)
assert_equals(matches("abc123xyz", "...z..."), true)
assert_equals(matches("pattern", "...pattern..."), true)
+ assert_equals(matches("pattern", "... pattern ..."), false)
end)
--- Inserts the '/* expect */' lines to the .c file, so that the .c file matches
--- the .exp file. Multiple 'expect' comments for a single line of code are not
--- handled correctly, but it's still better than doing the same work manually.
+-- Inserts the '/* expect */' lines to the .c file, so that the .c file
+-- matches the .exp file.
+--
+-- TODO: Fix crashes in tests with '# line file' preprocessing directives.
local function insert_missing(missing)
for fname, items in pairs(missing) do
- table.sort(items, function(a, b) return a.lineno > b.lineno end)
+ for i, item in ipairs(items) do
+ item.stable_sort_rank = i
+ end
+ local function less(a, b)
+ if a.lineno ~= b.lineno then
+ return a.lineno > b.lineno
+ end
+ return a.stable_sort_rank > b.stable_sort_rank
+ end
+ table.sort(items, less)
local lines = assert(load_lines(fname))
+ local seen = {}
for _, item in ipairs(items) do
local lineno, message = item.lineno, item.message
local indent = (lines[lineno] or ""):match("^([ \t]*)")
- local line = ("%s/* expect+1: %s */"):format(indent, message)
+ local offset = 1 + (seen[lineno] or 0)
+ local line = ("%s/* expect+%d: %s */"):format(indent, offset, message)
table.insert(lines, lineno, line)
+ seen[lineno] = (seen[lineno] or 0) + 1
end
save_lines(fname, lines)
end
@@ -222,9 +236,11 @@ local function check_test(c_fname, update)
local found = false
for i, c_comment in ipairs(c_comments) do
- if c_comment ~= "" and matches(expected_message, c_comment) then
- c_comments[i] = ""
- found = true
+ if c_comment ~= "" then
+ if matches(expected_message, c_comment) then
+ c_comments[i] = ""
+ found = true
+ end
break
end
end
@@ -262,13 +278,17 @@ end
local function main(args)
- local update = args[1] == "-u"
- if update then
- table.remove(args, 1)
+ local update = false
+ for _, arg in ipairs(args) do
+ if arg == "-u" then
+ update = true
+ end
end
for _, name in ipairs(args) do
- check_test(name, update)
+ if name ~= "-u" then
+ check_test(name, update)
+ end
end
end
diff --git a/usr.bin/xlint/lint1/d_bltinoffsetof.c b/usr.bin/xlint/lint1/d_bltinoffsetof.c
index 3b4b4df9e575..0a45df76f9b2 100644
--- a/usr.bin/xlint/lint1/d_bltinoffsetof.c
+++ b/usr.bin/xlint/lint1/d_bltinoffsetof.c
@@ -1,14 +1,48 @@
-/* $NetBSD: d_bltinoffsetof.c,v 1.2 2021/01/31 14:39:31 rillig Exp $ */
+/* $NetBSD: d_bltinoffsetof.c,v 1.3 2024/01/09 23:46:54 rillig Exp $ */
# 3 "d_bltinoffsetof.c"
struct foo {
- int a;
- char *b;
+ union {
+ struct {
+ struct {
+ int a;
+ int b;
+ } first;
+ char *second;
+ } s;
+ unsigned char padding[1000];
+ } u;
+ union {
+ int a;
+ double b;
+ } array[50];
};
+typedef int first[-(int)__builtin_offsetof(struct foo, u.s.first)];
+typedef int first_a[-(int)__builtin_offsetof(struct foo, u.s.first.a)];
+/* expect+1: ... (-4) ... */
+typedef int first_b[-(int)__builtin_offsetof(struct foo, u.s.first.b)];
+/* expect+1: ... (-8) ... */
+typedef int second[-(int)__builtin_offsetof(struct foo, u.s.second)];
-int
-main(void)
-{
- return __builtin_offsetof(struct foo, b);
-}
+/* expect+1: ... (-1000) ... */
+typedef int array[-(int)__builtin_offsetof(struct foo, array)];
+/* expect+1: ... (-1000) ... */
+typedef int array_0_a[-(int)__builtin_offsetof(struct foo, array[0].a)];
+/* expect+1: ... (-1000) ... */
+typedef int array_0_b[-(int)__builtin_offsetof(struct foo, array[0].b)];
+/* expect+1: ... (-1008) ... */
+typedef int array_1_a[-(int)__builtin_offsetof(struct foo, array[1].a)];
+
+// There is no element array[50], but pointing right behind the last element
+// may be fine.
+/* expect+1: ... (-1400) ... */
+typedef int array_50_a[-(int)__builtin_offsetof(struct foo, array[50].a)];
+/* expect+1: ... (-1400) ... */
+typedef int sizeof_foo[-(int)sizeof(struct foo)];
+
+
+// 51 is out of bounds, as it is larger than the size of the struct.
+// No warning though, maybe later.
+/* expect+1: ... (-1408) ... */
+typedef int array_51_a[-(int)__builtin_offsetof(struct foo, array[51].a)];
diff --git a/usr.bin/xlint/lint1/d_c99_bool_strict.c b/usr.bin/xlint/lint1/d_c99_bool_strict.c
index 859d133a18ec..7981a55a5076 100644
--- a/usr.bin/xlint/lint1/d_c99_bool_strict.c
+++ b/usr.bin/xlint/lint1/d_c99_bool_strict.c
@@ -1,4 +1,4 @@
-/* $NetBSD: d_c99_bool_strict.c,v 1.44 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: d_c99_bool_strict.c,v 1.56 2025/07/07 19:57:17 rillig Exp $ */
# 3 "d_c99_bool_strict.c"
/*
@@ -27,7 +27,7 @@
*
* strict-bool-controlling-expression:
* Controlling expressions in 'if', 'while', 'for', '?:' must be of
- * type bool.
+ * type bool, except for a literal 0 in a do-while loop.
*
* strict-bool-operand-unary:
* Operator bool? scalar?
@@ -59,32 +59,20 @@
*
* strict-bool-bitwise-and:
* Expressions of the form "flags & FLAG" are compatible with _Bool if
- * the left operand has enum type, the right operand is an integer
- * constant and the resulting value is used in a context where it is
- * implicitly and immediately compared to zero.
- *
- * Note: An efficient implementation technique for a collection of bool
- * flags is an enum. The enum declaration groups the available
- * constants, and as of 2020, compilers such as GCC and Clang have basic
- * support for detecting type mismatches on enums.
+ * the resulting value is used in a context where it is implicitly and
+ * immediately compared to zero.
*
* Note: Examples for such contexts are controlling expressions or the
* operands of the operators '!', '&&', '||'.
*
- * Note: Counterexamples for contexts are assignments to a bool variable.
- *
- * Note: These rules ensure that conforming code can be compiled without
- * change in behavior using old compilers that implement bool as an
- * ordinary integer type, without the special rule C99 6.3.1.2.
+ * Note: Counterexamples for contexts are assignments to a bool variable,
+ * as without the conversion from C99 6.3.1.2, converting an integer to a
+ * "bool-like" integer type truncated the value instead of comparing it
+ * to 0.
*
- * Note: There is a crucial difference between a _Bool variable and an
- * ordinary integer variable. C99 6.3.1.2 defines a conversion from an
- * arbitrary scalar value to _Bool as equivalent to (value != 0 ? 1 : 0).
- * This means that even if _Bool is implemented as an 8-bit unsigned
- * integer, assigning 256 to it would still result in the value 1 being
- * stored. Storing 256 in an ordinary 8-bit unsigned integer would
- * result in the value 0 being stored. See the test d_c99_bool.c for
- * more details.
+ * Note: These rules ensure that conforming code behaves the same in both
+ * C99 and in environments that emulate a boolean type using a small
+ * integer type.
*/
/*
@@ -134,11 +122,9 @@ strict_bool_constant(void)
enum strict_bool_constant_expressions {
/* Ok: __lint_false is a boolean constant expression. */
- /* expect+1: warning: constant in conditional context [161] */
FALSE = __lint_false ? 100 : 101,
/* Ok: __lint_true is a boolean constant expression. */
- /* expect+1: warning: constant in conditional context [161] */
TRUE = __lint_true ? 100 : 101,
/* Not ok: an integer is not a boolean constant expression. */
@@ -160,7 +146,7 @@ enum strict_bool_constant_expressions {
/*
* Without strict bool mode, these two variants of an expression can
* occur when a preprocessor macro is either defined to 1 or left
- * empty (since C99), as in lint1/ops.def.
+ * empty (since C99).
*
* In strict bool mode, the resulting expression can be compared
* against 0 to achieve the same effect (so +0 != 0 or 1 + 0 != 0).
@@ -171,14 +157,12 @@ enum strict_bool_constant_expressions {
UNARY_PLUS = (+0) ? 100 : 101,
/* The main operator '>' has return type bool. */
- /* expect+1: warning: constant in conditional context [161] */
Q1 = (13 > 12) ? 100 : 101,
/*
* The parenthesized expression has type int and thus cannot be
* used as the controlling expression in the '?:' operator.
*/
- /* expect+2: warning: constant in conditional context [161] */
/* expect+1: error: left operand of '?' must be bool, not 'int' [331] */
Q2 = (13 > 12 ? 1 : 7) ? 100 : 101,
@@ -194,14 +178,12 @@ enum strict_bool_constant_expressions {
BINOR_BOOL = __lint_false | __lint_true,
BINOR_INT = 0 | 1,
- /* expect+2: warning: constant in conditional context [161] */
/* expect+1: error: integral constant expression expected [55] */
LOGOR_BOOL = __lint_false || __lint_true,
/* expect+2: error: left operand of '||' must be bool, not 'int' [331] */
/* expect+1: error: right operand of '||' must be bool, not 'int' [332] */
LOGOR_INT = 0 || 1,
- /* expect+2: warning: constant in conditional context [161] */
/* expect+1: error: integral constant expression expected [55] */
LOGAND_BOOL = __lint_false && __lint_true,
/* expect+2: error: left operand of '&&' must be bool, not 'int' [331] */
@@ -340,12 +322,12 @@ strict_bool_conversion_function_argument_pass(bool b, int i, const char *p)
/* Implicitly converting int to bool (arg #1). */
/* expect+2: error: parameter 1 expects '_Bool', gets passed 'int' [334] */
- /* expect+1: warning: illegal combination of pointer 'pointer to const char' and integer 'int', arg #3 [154] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to const char' and integer 'int', arg #3 [154] */
take_arguments(i, i, i);
/* Implicitly converting pointer to bool (arg #1). */
/* expect+2: error: parameter 1 expects '_Bool', gets passed 'pointer' [334] */
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to const char', arg #2 [154] */
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to const char', arg #2 [154] */
take_arguments(p, p, p);
/* Passing bool as vararg. */
@@ -413,20 +395,16 @@ strict_bool_conversion_from_bool_to_scalar(bool b)
}
/*
- * strict-bool-controlling-expression:
- * Controlling expressions in 'if', 'while', 'for', '?:' must be of
- * type bool.
+ * strict-bool-controlling-expression
*/
void
strict_bool_controlling_expression(bool b, int i, double d, const void *p)
{
- /* expect+1: warning: constant in conditional context [161] */
if (__lint_false)
+ /* expect+1: warning: 'call' statement not reached [193] */
do_nothing();
- /* expect-1: warning: statement not reached [193] */
- /* expect+1: warning: constant in conditional context [161] */
if (__lint_true)
do_nothing();
@@ -434,16 +412,16 @@ strict_bool_controlling_expression(bool b, int i, double d, const void *p)
do_nothing();
/* expect+1: error: controlling expression must be bool, not 'int' [333] */
- if (/*CONSTCOND*/0)
+ if (0)
+ /* expect+1: warning: 'call' statement not reached [193] */
do_nothing();
- /* expect-1: warning: statement not reached [193] */
/* expect+1: error: controlling expression must be bool, not 'int' [333] */
- if (/*CONSTCOND*/1)
+ if (1)
do_nothing();
/* expect+1: error: controlling expression must be bool, not 'int' [333] */
- if (/*CONSTCOND*/2)
+ if (2)
do_nothing();
/* Not allowed: There is no implicit conversion from scalar to bool. */
@@ -466,14 +444,31 @@ strict_bool_controlling_expression(bool b, int i, double d, const void *p)
do_nothing();
if (p != (void *)0)
do_nothing();
+
+ // An endless loop. The preferred form is 'for (;;)' instead.
+ do {
+ } while (__lint_true);
+
+ // A do-once "loop", often used in statement macros.
+ do {
+ } while (__lint_false);
+
+ // This form is too unusual to be allowed in strict bool mode.
+ do {
+ /* expect+1: error: controlling expression must be bool, not 'int' [333] */
+ } while (1);
+
+ // Even though 0 is an integer instead of a bool, this idiom is so
+ // common that it is frequently used in system headers. Since the
+ // Clang preprocessor does not mark each token as coming from a system
+ // header or from user code, this idiom can only be allowed everywhere
+ // or nowhere.
+ do {
+ } while (0);
}
/*
- * strict-bool-operand-unary:
- * Operator bool? scalar?
- * ! yes -
- * & yes yes
- * The other unary operators do not accept bool operands.
+ * strict-bool-operand-unary
*/
void
@@ -483,11 +478,7 @@ strict_bool_operand_unary_not(void)
b = !b;
b = !!!b;
- /* expect+2: warning: constant in conditional context [161] */
- /* expect+1: warning: constant operand to '!' [239] */
b = !__lint_false;
- /* expect+2: warning: constant in conditional context [161] */
- /* expect+1: warning: constant operand to '!' [239] */
b = !__lint_true;
int i = 0;
@@ -517,23 +508,7 @@ strict_bool_operand_unary_address(void)
/* see strict_bool_operand_unary_all below for the other unary operators. */
/*
- * strict-bool-operand-binary:
- * Operator left: bool? other? right: bool? other?
- * . - yes yes yes
- * -> - yes yes yes
- * <=, <, >=, > - yes - yes
- * ==, != yes yes yes yes
- * & yes yes yes yes
- * ^ yes yes yes yes
- * | yes yes yes yes
- * && yes - yes -
- * || yes - yes -
- * ? yes - yes yes
- * : yes yes yes yes
- * = yes yes yes yes
- * &=, ^=, |= yes yes yes yes
- * , yes yes yes yes
- * The other binary operators do not accept bool operands.
+ * strict-bool-operand-binary
*/
/*
@@ -739,9 +714,7 @@ strict_bool_operand_binary_comma(bool b, int i)
}
/*
- * strict-bool-operator-result:
- * The result type of the operators '!', '<', '<=', '>', '>=',
- * '==', '!=', '&&', '||' is _Bool instead of int.
+ * strict-bool-operator-result
*/
void
@@ -793,20 +766,7 @@ strict_bool_operator_result(bool b)
/*
- * strict-bool-bitwise-and:
- * Expressions of the form "flags & FLAG" are compatible with _Bool if
- * the left operand has enum type, the right operand is an integer
- * constant and the resulting value is used in a context where it is
- * implicitly and immediately compared to zero.
- *
- * Note: Examples for such contexts are controlling expressions or the
- * operands of the operators '!', '&&', '||'.
- *
- * Note: Counterexamples for contexts are assignments to a bool variable.
- *
- * Note: These rules ensure that conforming code can be compiled without
- * change in behavior using old compilers that implement bool as an
- * ordinary integer type, without the special rule C99 6.3.1.2.
+ * strict-bool-bitwise-and
*/
enum Flags {
@@ -858,7 +818,7 @@ strict_bool_bitwise_and_enum(enum Flags flags)
* what would fit into an unsigned char). Even if an enum could be extended
* to larger types than int, this pattern would work.
*/
-void
+bool
query_flag_from_enum_bit_set(enum Flags flags)
{
if (flags & FLAG0)
@@ -878,6 +838,45 @@ query_flag_from_enum_bit_set(enum Flags flags)
if (flags & FLAG28)
println("FLAG28 is set");
+
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b0 = flags & FLAG0;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b1 = flags & FLAG1;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b28 = flags & FLAG28;
+ return b0 || b1 || b28;
+}
+
+bool
+query_flag_from_int(int flags)
+{
+
+ if (flags & FLAG0)
+ println("FLAG0 is set");
+
+ if ((flags & FLAG1) != 0)
+ println("FLAG1 is set");
+
+ if ((flags & (FLAG0 | FLAG1)) == (FLAG0 | FLAG1))
+ println("FLAG0 and FLAG1 are both set");
+
+ if (flags & FLAG0 && flags & FLAG1)
+ println("FLAG0 and FLAG1 are both set");
+
+ if ((flags & (FLAG0 | FLAG1)) != 0)
+ println("At least one of FLAG0 and FLAG1 is set");
+
+ if (flags & FLAG28)
+ println("FLAG28 is set");
+
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b0 = flags & FLAG0;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b1 = flags & FLAG1;
+ /* expect+1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
+ bool b28 = flags & FLAG28;
+ return b0 || b1 || b28;
}
@@ -916,23 +915,6 @@ bool_as_array_index(bool cond)
}
void
-do_while_false(void)
-{
- do {
-
- } while (__lint_false);
-}
-
-void
-do_while_true(void)
-{
- do {
-
- } while (__lint_true);
- /* expect-1: warning: constant in conditional context [161] */
-}
-
-void
initialization(void)
{
struct {
@@ -946,127 +928,3 @@ initialization(void)
{ 1 },
};
}
-
-/*
- * For expressions that originate from a system header, the strict type rules
- * are relaxed a bit, to allow for expressions like 'flags & FLAG', even
- * though they are not strictly boolean.
- *
- * This shouldn't apply to function call expressions though since one of the
- * goals of strict bool mode is to normalize all expressions calling 'strcmp'
- * to be of the form 'strcmp(a, b) == 0' instead of '!strcmp(a, b)'.
- */
-# 1 "stdio.h" 1 3 4
-typedef struct stdio_file {
- int fd;
-} FILE;
-int ferror(FILE *);
-FILE stdio_files[3];
-FILE *stdio_stdout;
-# 967 "d_c99_bool_strict.c" 2
-# 1 "string.h" 1 3 4
-int strcmp(const char *, const char *);
-# 970 "d_c99_bool_strict.c" 2
-
-void
-controlling_expression(FILE *f, const char *a, const char *b)
-{
- /* expect+1: error: controlling expression must be bool, not 'int' [333] */
- if (ferror(f))
- return;
- /* expect+1: error: controlling expression must be bool, not 'int' [333] */
- if (strcmp(a, b))
- return;
- /* expect+1: error: operand of '!' must be bool, not 'int' [330] */
- if (!ferror(f))
- return;
- /* expect+1: error: operand of '!' must be bool, not 'int' [330] */
- if (!strcmp(a, b))
- return;
-
- /*
- * Before tree.c 1.395 from 2021-11-16, the expression below didn't
- * produce a warning since the expression 'stdio_files' came from a
- * system header (via a macro), and this property was passed up to
- * the expression 'ferror(stdio_files[1])'.
- *
- * That was wrong though since the type of a function call expression
- * only depends on the function itself but not its arguments types.
- * The old rule had allowed a raw condition 'strcmp(a, b)' without
- * the comparison '!= 0', as long as one of its arguments came from a
- * system header.
- *
- * Seen in bin/echo/echo.c, function main, call to ferror.
- */
- /* expect+5: error: controlling expression must be bool, not 'int' [333] */
- if (ferror(
-# 1004 "d_c99_bool_strict.c" 3 4
- &stdio_files[1]
-# 1006 "d_c99_bool_strict.c"
- ))
- return;
-
- /*
- * Before cgram.y 1.369 from 2021-11-16, at the end of parsing the
- * name 'stdio_stdout', the parser already looked ahead to the next
- * token, to see whether it was the '(' of a function call.
- *
- * At that point, the parser was no longer in a system header,
- * therefore 'stdio_stdout' had tn_sys == false, and this information
- * was pushed down to the whole function call expression (which was
- * another bug that got fixed in tree.c 1.395 from 2021-11-16).
- */
- /* expect+5: error: controlling expression must be bool, not 'int' [333] */
- if (ferror(
-# 1022 "d_c99_bool_strict.c" 3 4
- stdio_stdout
-# 1024 "d_c99_bool_strict.c"
- ))
- return;
-
- /*
- * In this variant of the pattern, there is a token ')' after the
- * name 'stdio_stdout', which even before tree.c 1.395 from
- * 2021-11-16 had the effect that at the end of parsing the name, the
- * parser was still in the system header, thus setting tn_sys (or
- * rather tn_relaxed at that time) to true.
- */
- /* expect+5: error: controlling expression must be bool, not 'int' [333] */
- if (ferror(
-# 1037 "d_c99_bool_strict.c" 3 4
- (stdio_stdout)
-# 1039 "d_c99_bool_strict.c"
- ))
- return;
-
- /*
- * Before cgram.y 1.369 from 2021-11-16, the comment following
- * 'stdio_stdout' did not prevent the search for '('. At the point
- * where build_name called expr_alloc_tnode, the parser was already
- * in the main file again, thus treating 'stdio_stdout' as not coming
- * from a system header.
- *
- * This has been fixed in tree.c 1.395 from 2021-11-16. Before that,
- * an expression had come from a system header if its operands came
- * from a system header, but that was only close to the truth. In a
- * case where both operands come from a system header but the
- * operator comes from the main translation unit, the main
- * translation unit still has control over the whole expression. So
- * the correct approach is to focus on the operator, not the
- * operands. There are a few corner cases where the operator is
- * invisible (for implicit conversions) or synthetic (for translating
- * 'arr[index]' to '*(arr + index)', but these are handled as well.
- */
- /* expect+5: error: controlling expression must be bool, not 'int' [333] */
- if (ferror(
-# 1063 "d_c99_bool_strict.c" 3 4
- stdio_stdout /* comment */
-# 1065 "d_c99_bool_strict.c"
- ))
- return;
-}
-
-// In strict bool mode, the identifiers '__lint_false' and '__lint_true' are
-// predefined, but not any others.
-/* expect+1: error: '__lint_unknown' undefined [99] */
-int unknown = sizeof __lint_unknown;
diff --git a/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c b/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c
index 8345bb63fd8a..36e7fd2ac739 100644
--- a/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c
+++ b/usr.bin/xlint/lint1/d_c99_bool_strict_syshdr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: d_c99_bool_strict_syshdr.c,v 1.22 2023/08/06 19:44:50 rillig Exp $ */
+/* $NetBSD: d_c99_bool_strict_syshdr.c,v 1.27 2025/04/10 20:37:48 rillig Exp $ */
# 3 "d_c99_bool_strict_syshdr.c"
/*
@@ -17,33 +17,31 @@ extern const unsigned short *ctype_table;
extern void println(const char *);
+
/*
- * On NetBSD 8, <sys/select.h> defines FD_ISSET by enclosing the statements
- * in the well-known 'do { ... } while (CONSTCOND 0)' loop. The 0 in the
- * controlling expression has type INT but should be allowed nevertheless
- * since that header does not have a way to distinguish between bool and int.
- * It just follows the C99 standard, unlike the lint-provided stdbool.h,
- * which redefines 'false' to '__lint_false'.
+ * No matter whether the code is from a system header or not, the idiom
+ * 'do { ... } while (0)' is well known, and using the integer constant 0
+ * instead of the boolean constant 'false' neither creates any type confusion
+ * nor does its value take place in any conversions, as its scope is limited
+ * to the controlling expression of the loop.
*/
void
-strict_bool_system_header_statement_macro(void)
+statement_macro(void)
{
do {
println("nothing");
- } while (/*CONSTCOND*/0);
- /* expect-1: error: controlling expression must be bool, not 'int' [333] */
+ } while (0);
-# 38 "d_c99_bool_strict_syshdr.c" 3 4
+# 37 "d_c99_bool_strict_syshdr.c" 3 4
do {
println("nothing");
- } while (/*CONSTCOND*/0); /* ok */
+ } while (0);
-# 43 "d_c99_bool_strict_syshdr.c"
+# 42 "d_c99_bool_strict_syshdr.c"
do {
println("nothing");
- } while (/*CONSTCOND*/0);
- /* expect-1: error: controlling expression must be bool, not 'int' [333] */
+ } while (0);
}
@@ -74,29 +72,29 @@ strict_bool_system_header_ctype(int c)
* All other combinations of type are safe from truncation.
*/
_Bool system_int_assigned_to_bool =
-# 78 "d_c99_bool_strict_syshdr.c" 3 4
+# 76 "d_c99_bool_strict_syshdr.c" 3 4
(int)((ctype_table + 1)[c] & 0x0040) /* INT */
-# 80 "d_c99_bool_strict_syshdr.c"
+# 78 "d_c99_bool_strict_syshdr.c"
;
/* expect-1: error: operands of 'init' have incompatible types '_Bool' and 'int' [107] */
int system_bool_assigned_to_int =
-# 85 "d_c99_bool_strict_syshdr.c" 3 4
+# 83 "d_c99_bool_strict_syshdr.c" 3 4
(int)((ctype_table + 1)[c] & 0x0040) != 0 /* BOOL */
-# 87 "d_c99_bool_strict_syshdr.c"
+# 85 "d_c99_bool_strict_syshdr.c"
;
if (
-# 91 "d_c99_bool_strict_syshdr.c" 3 4
+# 89 "d_c99_bool_strict_syshdr.c" 3 4
(int)((ctype_table + 1)[c] & 0x0040) /* INT */
-# 93 "d_c99_bool_strict_syshdr.c"
+# 91 "d_c99_bool_strict_syshdr.c"
)
println("system macro returning INT");
if (
-# 98 "d_c99_bool_strict_syshdr.c" 3 4
+# 96 "d_c99_bool_strict_syshdr.c" 3 4
((ctype_table + 1)[c] & 0x0040) != 0 /* BOOL */
-# 100 "d_c99_bool_strict_syshdr.c"
+# 98 "d_c99_bool_strict_syshdr.c"
)
println("system macro returning BOOL");
}
@@ -105,9 +103,9 @@ static inline _Bool
ch_isspace_sys_int(char c)
{
return
-# 109 "d_c99_bool_strict_syshdr.c" 3 4
+# 107 "d_c99_bool_strict_syshdr.c" 3 4
((ctype_table + 1)[c] & 0x0040)
-# 111 "d_c99_bool_strict_syshdr.c"
+# 109 "d_c99_bool_strict_syshdr.c"
!= 0;
}
@@ -120,9 +118,9 @@ static inline _Bool
ch_isspace_sys_bool(char c)
{
return
-# 124 "d_c99_bool_strict_syshdr.c" 3 4
+# 122 "d_c99_bool_strict_syshdr.c" 3 4
((ctype_table + 1)[(unsigned char)c] & 0x0040) != 0
-# 126 "d_c99_bool_strict_syshdr.c"
+# 124 "d_c99_bool_strict_syshdr.c"
!= 0;
}
@@ -147,7 +145,7 @@ ch_isspace_sys_bool(char c)
extern int finite(double);
# 1 "string.h" 3 4
extern int strcmp(const char *, const char *);
-# 151 "d_c99_bool_strict_syshdr.c"
+# 149 "d_c99_bool_strict_syshdr.c"
/*ARGSUSED*/
_Bool
@@ -193,13 +191,13 @@ controlling_expression_with_comma_operator(void)
int c;
while (c = read_char(),
-# 197 "d_c99_bool_strict_syshdr.c" 3 4
+# 195 "d_c99_bool_strict_syshdr.c" 3 4
((int)((ctype_table + 1)[(
-# 199 "d_c99_bool_strict_syshdr.c"
+# 197 "d_c99_bool_strict_syshdr.c"
c
-# 201 "d_c99_bool_strict_syshdr.c" 3 4
+# 199 "d_c99_bool_strict_syshdr.c" 3 4
)] & 0x0040 /* Space */))
-# 203 "d_c99_bool_strict_syshdr.c"
+# 201 "d_c99_bool_strict_syshdr.c"
)
continue;
}
@@ -209,8 +207,8 @@ void take_bool(_Bool);
/*
* On NetBSD, the header <curses.h> defines TRUE or FALSE as integer
- * constants with a CONSTCOND comment. This comment suppresses legitimate
- * warnings in user code; that's irrelevant for this test though.
+ * constants, not as bool constants.
+ *
*
* Several curses functions take bool as a parameter, for example keypad or
* leaveok. Before ckbool.c 1.14 from 2022-05-19, lint did not complain when
@@ -223,28 +221,28 @@ pass_bool_to_function(void)
/* expect+5: error: parameter 1 expects '_Bool', gets passed 'int' [334] */
take_bool(
-# 227 "d_c99_bool_strict_syshdr.c" 3 4
- (/*CONSTCOND*/1)
-# 229 "d_c99_bool_strict_syshdr.c"
+# 225 "d_c99_bool_strict_syshdr.c" 3 4
+ (1)
+# 227 "d_c99_bool_strict_syshdr.c"
);
take_bool(
-# 233 "d_c99_bool_strict_syshdr.c" 3 4
+# 231 "d_c99_bool_strict_syshdr.c" 3 4
__lint_true
-# 235 "d_c99_bool_strict_syshdr.c"
+# 233 "d_c99_bool_strict_syshdr.c"
);
/* expect+5: error: parameter 1 expects '_Bool', gets passed 'int' [334] */
take_bool(
-# 240 "d_c99_bool_strict_syshdr.c" 3 4
- (/*CONSTCOND*/0)
-# 242 "d_c99_bool_strict_syshdr.c"
+# 238 "d_c99_bool_strict_syshdr.c" 3 4
+ (0)
+# 240 "d_c99_bool_strict_syshdr.c"
);
take_bool(
-# 246 "d_c99_bool_strict_syshdr.c" 3 4
+# 244 "d_c99_bool_strict_syshdr.c" 3 4
__lint_false
-# 248 "d_c99_bool_strict_syshdr.c"
+# 246 "d_c99_bool_strict_syshdr.c"
);
}
@@ -262,27 +260,147 @@ if_pointer_or_int(void)
{
/* if (NULL) */
if (
-# 266 "d_c99_bool_strict_syshdr.c" 3 4
+# 264 "d_c99_bool_strict_syshdr.c" 3 4
((void *)0)
-# 268 "d_c99_bool_strict_syshdr.c"
+# 266 "d_c99_bool_strict_syshdr.c"
)
+ /* expect+1: warning: 'return' statement not reached [193] */
return;
- /* expect-1: warning: statement not reached [193] */
/* if (EXIT_SUCCESS) */
if (
-# 275 "d_c99_bool_strict_syshdr.c" 3 4
+# 273 "d_c99_bool_strict_syshdr.c" 3 4
0
-# 277 "d_c99_bool_strict_syshdr.c"
+# 275 "d_c99_bool_strict_syshdr.c"
)
+ /* expect+1: warning: 'return' statement not reached [193] */
return;
- /* expect-1: warning: statement not reached [193] */
/* if (errno) */
if (
-# 284 "d_c99_bool_strict_syshdr.c" 3 4
+# 282 "d_c99_bool_strict_syshdr.c" 3 4
(*errno_location())
-# 286 "d_c99_bool_strict_syshdr.c"
+# 284 "d_c99_bool_strict_syshdr.c"
)
return;
}
+
+
+/*
+ * For expressions that originate from a system header, the strict type rules
+ * are relaxed a bit, to allow for expressions like 'flags & FLAG', even
+ * though they are not strictly boolean.
+ *
+ * This shouldn't apply to function call expressions though since one of the
+ * goals of strict bool mode is to normalize all expressions calling 'strcmp'
+ * to be of the form 'strcmp(a, b) == 0' instead of '!strcmp(a, b)'.
+ */
+# 1 "stdio.h" 1 3 4
+typedef struct stdio_file {
+ int fd;
+} FILE;
+int ferror(FILE *);
+FILE stdio_files[3];
+FILE *stdio_stdout;
+# 306 "d_c99_bool_strict_syshdr.c" 2
+# 1 "string.h" 1 3 4
+int strcmp(const char *, const char *);
+# 309 "d_c99_bool_strict_syshdr.c" 2
+
+void
+controlling_expression(FILE *f, const char *a, const char *b)
+{
+ /* expect+1: error: controlling expression must be bool, not 'int' [333] */
+ if (ferror(f))
+ return;
+ /* expect+1: error: controlling expression must be bool, not 'int' [333] */
+ if (strcmp(a, b))
+ return;
+ /* expect+1: error: operand of '!' must be bool, not 'int' [330] */
+ if (!ferror(f))
+ return;
+ /* expect+1: error: operand of '!' must be bool, not 'int' [330] */
+ if (!strcmp(a, b))
+ return;
+
+ /*
+ * Before tree.c 1.395 from 2021-11-16, the expression below didn't
+ * produce a warning since the expression 'stdio_files' came from a
+ * system header (via a macro), and this property was passed up to
+ * the expression 'ferror(stdio_files[1])'.
+ *
+ * That was wrong though since the type of a function call expression
+ * only depends on the function itself but not its arguments types.
+ * The old rule had allowed a raw condition 'strcmp(a, b)' without
+ * the comparison '!= 0', as long as one of its arguments came from a
+ * system header.
+ *
+ * Seen in bin/echo/echo.c, function main, call to ferror.
+ */
+ /* expect+5: error: controlling expression must be bool, not 'int' [333] */
+ if (ferror(
+# 343 "d_c99_bool_strict_syshdr.c" 3 4
+ &stdio_files[1]
+# 345 "d_c99_bool_strict_syshdr.c"
+ ))
+ return;
+
+ /*
+ * Before cgram.y 1.369 from 2021-11-16, at the end of parsing the
+ * name 'stdio_stdout', the parser already looked ahead to the next
+ * token, to see whether it was the '(' of a function call.
+ *
+ * At that point, the parser was no longer in a system header,
+ * therefore 'stdio_stdout' had tn_sys == false, and this information
+ * was pushed down to the whole function call expression (which was
+ * another bug that got fixed in tree.c 1.395 from 2021-11-16).
+ */
+ /* expect+5: error: controlling expression must be bool, not 'int' [333] */
+ if (ferror(
+# 361 "d_c99_bool_strict_syshdr.c" 3 4
+ stdio_stdout
+# 363 "d_c99_bool_strict_syshdr.c"
+ ))
+ return;
+
+ /*
+ * In this variant of the pattern, there is a token ')' after the
+ * name 'stdio_stdout', which even before tree.c 1.395 from
+ * 2021-11-16 had the effect that at the end of parsing the name, the
+ * parser was still in the system header, thus setting tn_sys (or
+ * rather tn_relaxed at that time) to true.
+ */
+ /* expect+5: error: controlling expression must be bool, not 'int' [333] */
+ if (ferror(
+# 376 "d_c99_bool_strict_syshdr.c" 3 4
+ (stdio_stdout)
+# 378 "d_c99_bool_strict_syshdr.c"
+ ))
+ return;
+
+ /*
+ * Before cgram.y 1.369 from 2021-11-16, the comment following
+ * 'stdio_stdout' did not prevent the search for '('. At the point
+ * where build_name called expr_alloc_tnode, the parser was already
+ * in the main file again, thus treating 'stdio_stdout' as not coming
+ * from a system header.
+ *
+ * This has been fixed in tree.c 1.395 from 2021-11-16. Before that,
+ * an expression had come from a system header if its operands came
+ * from a system header, but that was only close to the truth. In a
+ * case where both operands come from a system header but the
+ * operator comes from the main translation unit, the main
+ * translation unit still has control over the whole expression. So
+ * the correct approach is to focus on the operator, not the
+ * operands. There are a few corner cases where the operator is
+ * invisible (for implicit conversions) or synthetic (for translating
+ * 'arr[index]' to '*(arr + index)', but these are handled as well.
+ */
+ /* expect+5: error: controlling expression must be bool, not 'int' [333] */
+ if (ferror(
+# 402 "d_c99_bool_strict_syshdr.c" 3 4
+ stdio_stdout /* comment */
+# 404 "d_c99_bool_strict_syshdr.c"
+ ))
+ return;
+}
diff --git a/usr.bin/xlint/lint1/d_c99_for_loops.c b/usr.bin/xlint/lint1/d_c99_for_loops.c
deleted file mode 100644
index 01002afe52be..000000000000
--- a/usr.bin/xlint/lint1/d_c99_for_loops.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* $NetBSD: d_c99_for_loops.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_for_loops.c"
-
-/* lint1-extra-flags: -X 351 */
-
-extern void foo(int);
-
-int
-main(void)
-{
- // Test the basic functionality
- for (int i = 0; i < 10; i++)
- foo(i);
-
- // Test that the scope of the iterator is correct
- for (int i = 0; i < 10; i++)
- continue;
- return 0;
-}
diff --git a/usr.bin/xlint/lint1/d_c99_func.c b/usr.bin/xlint/lint1/d_c99_func.c
deleted file mode 100644
index 402d6e91d49d..000000000000
--- a/usr.bin/xlint/lint1/d_c99_func.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* $NetBSD: d_c99_func.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_func.c"
-
-/* C99 __func__ */
-
-/* lint1-extra-flags: -X 351 */
-
-const char *str;
-
-const char *
-function_name(void)
-{
- /* expect+1: error: negative array dimension (-14) [20] */
- typedef int reveal_size[-(int)sizeof(__func__)];
- return __func__;
-}
diff --git a/usr.bin/xlint/lint1/d_c99_init.c b/usr.bin/xlint/lint1/d_c99_init.c
deleted file mode 100644
index abc2a89d3b63..000000000000
--- a/usr.bin/xlint/lint1/d_c99_init.c
+++ /dev/null
@@ -1,566 +0,0 @@
-/* $NetBSD: d_c99_init.c,v 1.46 2023/07/09 11:01:27 rillig Exp $ */
-# 3 "d_c99_init.c"
-
-/*
- * Test C99 initializers.
- *
- * See C99 6.7.8 "Initialization".
-*/
-
-/* lint1-extra-flags: -X 351 */
-
-
-void use(const void *);
-
-typedef struct any {
- const void *value;
-} any;
-
-
-// C99 6.7.8p11 says "optionally enclosed in braces". Whether this wording
-// means "a single pair of braces" or "as many pairs of braces as you want"
-// is left for interpretation to the reader.
-int scalar_without_braces = 3;
-int scalar_with_optional_braces = { 3 };
-int scalar_with_too_many_braces = {{ 3 }};
-/* expect+1: error: too many initializers [174] */
-int scalar_with_too_many_initializers = { 3, 5 };
-
-
-// See initialization_expr, 'handing over to INIT'.
-void
-struct_initialization_via_assignment(any arg)
-{
- any local = arg;
- use(&local);
-}
-
-
-// See initialization_expr, initialization_init_array_from_string.
-char static_duration[] = "static duration";
-signed char static_duration_signed[] = "static duration";
-unsigned char static_duration_unsigned[] = "static duration";
-int static_duration_wchar[] = L"static duration";
-
-// See init_expr.
-void
-initialization_by_braced_string(void)
-{
- any local = { "hello" };
- use(&local);
-}
-
-void
-initialization_by_redundantly_braced_string(void)
-{
- any local = {{{{ "hello" }}}};
- use(&local);
-}
-
-/*
- * Only scalar expressions and string literals may be enclosed by additional
- * braces. Since 'arg' is a struct, this is a compile-time error.
- */
-void
-initialization_with_too_many_braces(any arg)
-{
- /* expect+1: error: cannot initialize 'pointer to const void' from 'struct any' [185] */
- any local = { arg };
- use(&arg);
-}
-
-// Some of the following examples are mentioned in the introduction comment
-// in init.c.
-
-int number = 12345;
-
-int number_with_braces_and_comma = {
- 12345,
-};
-
-int array_with_fixed_size[3] = {
- 111,
- 222,
- 333,
- /* expect+1: error: too many array initializers, expected 3 [173] */
- 444,
-};
-
-// See update_type_of_array_of_unknown_size.
-int array_of_unknown_size[] = {
- 111,
- 222,
- 333,
-};
-
-int array_flat[2][2] = {
- 11,
- 12,
- 21,
- 22
-};
-
-int array_nested[2][2] = {
- {
- 11,
- 12
- },
- {
- 21,
- 22
- }
-};
-
-int array_with_designators[] = {
- ['1'] = 111,
- ['5'] = 555,
- ['9'] = 999
-};
-
-int array_with_some_designators[] = {
- ['1'] = 111,
- 222,
- ['9'] = 999
-};
-
-struct point {
- int x;
- int y;
-};
-
-struct point point = {
- 3,
- 4
-};
-
-struct point point_with_designators = {
- .y = 4,
- .x = 3,
-};
-
-struct point point_with_mixed_designators = {
- .x = 3,
- 4,
- /* expect+1: error: too many struct/union initializers [172] */
- 5,
- .x = 3,
-};
-
-/*
- * Before cgram.y 1.230 from 2021-06-20, the grammar allowed either of the
- * operators '.' or '->' to be used for the designators and had extra code
- * to ensure that only '.' was actually used.
- */
-struct point origin = {
- .x = 0,
- /* expect+1: error: syntax error '->' [249] */
- ->y = 0,
-};
-
-/* Ensure that the parser can recover from the parse error. */
-struct point pythagoras = { 3, 4 };
-
-int array_with_designator[] = {
- 111,
- /* expect+1: error: syntax error 'designator '.member' is only for struct/union' [249] */
- .member = 222,
- 333,
-};
-
-/*
- * C99 6.7.8p11 says that the initializer of a scalar can be "optionally
- * enclosed in braces". It does not explicitly set an upper limit on the
- * number of braces. It also doesn't restrict the term "initializer" to only
- * mean the "outermost initializer". 6.7.8p13 defines that a brace for a
- * structure or union always means to descend into the type. Both GCC 10 and
- * Clang 8 already warn about these extra braces, nevertheless there is
- * real-life code (the Postfix MTA) that exploits this corner case of the
- * standard.
- */
-struct point scalar_with_several_braces = {
- {{{3}}},
- {{{{4}}}},
-};
-
-struct rectangle {
- struct point top_left;
- struct point bottom_right;
-};
-
-/* C99 6.7.8p18 */
-struct rectangle screen = {
- .bottom_right = {
- 1920,
- 1080,
- }
-};
-
-/*
- * C99 6.7.8p22 says: At the _end_ of its initializer list, the array no
- * longer has incomplete type.
- */
-struct point points[] = {
- {
- /*
- * At this point, the size of the object 'points' is not known
- * yet since its type is still incomplete. Lint could warn
- * about this, but GCC and Clang already do.
- *
- * Before init.c 1.179 from 2021.03.30, the type information
- * of 'points' was set too early, resulting in a negative
- * array size below.
- */
- sizeof(int[-(int)sizeof(points)]),
- 4
- }
-};
-
-
-struct triangle {
- struct point points[3];
-};
-
-struct pentagon {
- struct point points[5];
-};
-
-struct geometry {
- struct pentagon pentagons[6];
- struct triangle triangles[10];
- struct point points[3][5][2];
-};
-
-/*
- * Initialization of a complex struct containing nested arrays and nested
- * structs.
- */
-struct geometry geometry = {
- .pentagons[0].points[4].x = 1,
- .points[0][0][0] = { 0, 0 },
- .points[2][4][1] = {301, 302 },
- /* expect+1: error: array subscript cannot be > 2: 3 [168] */
- .points[3][0][0] = {3001, 3002 },
- /* expect+1: error: array subscript cannot be > 4: 5 [168] */
- .points[0][5][0] = {501, 502 },
- /* expect+1: error: array subscript cannot be > 1: 2 [168] */
- .points[0][0][2] = {21, 22 },
-};
-
-struct ends_with_unnamed_bit_field {
- int member;
- int:0;
-} ends_with_unnamed_bit_field = {
- 12345,
- /* expect+1: error: too many struct/union initializers [172] */
- 23456,
-};
-
-char prefixed_message[] = {
- 'E', ':', ' ',
- /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
- "message\n",
-};
-
-char message_with_suffix[] = {
- "message",
- /* The excess character is not detected by lint but by compilers. */
- '\n',
-};
-
-struct ten {
- int i0;
- int i1;
- int i2;
- int i3;
- int i4;
- int i5;
- int i6;
- int i7;
- int i8;
- int i9;
-};
-
-struct ten ten = {
- .i3 = 3,
- 4,
- 5,
- 6,
-};
-
-
-/*
- * ISO C99 6.7.8 provides a large list of examples for initialization,
- * covering all tricky edge cases.
- */
-
-int c99_6_7_8_p24_example1_i = 3.5;
-double _Complex c99_6_7_8_p24_example1_c = 5 + 3 * 1.0fi;
-
-int c99_6_7_8_p25_example2[] = { 1, 3, 5 };
-
-int c99_6_7_8_p26_example3a[4][3] = {
- { 1, 3, 5 },
- { 2, 4, 6 },
- { 3, 5, 7 },
-};
-
-int c99_6_7_8_p26_example3b[4][3] = {
- 1, 3, 5, 2, 4, 6, 3, 5, 7
-};
-
-int c99_6_7_8_p27_example4[4][3] = {
- { 1 }, { 2 }, { 3 }, { 4 }
-};
-
-struct {
- int a[3], b;
-} c99_6_7_8_p28_example5[] = {
- { 1 },
- 2,
-};
-
-short c99_6_7_8_p29_example6a[4][3][2] = {
- { 1 },
- { 2, 3 },
- { 4, 5, 6 },
-};
-
-short c99_6_7_8_p29_example6b[4][3][2] = {
- 1, 0, 0, 0, 0, 0,
- 2, 3, 0, 0, 0, 0,
- 4, 5, 6, 0, 0, 0,
-};
-
-short c99_6_7_8_p29_example6c[4][3][2] = {
- {
- { 1 },
- },
- {
- { 2, 3 },
- },
- {
- { 4, 5 },
- { 6 },
- }
-};
-
-void
-c99_6_7_8_p31_example7(void)
-{
- typedef int A[];
-
- A a = { 1, 2 }, b = { 3, 4, 5 };
-
- /* expect+1: error: negative array dimension (-8) [20] */
- typedef int reveal_sizeof_a[-(int)(sizeof(a))];
- /* expect+1: error: negative array dimension (-12) [20] */
- typedef int reveal_sizeof_b[-(int)(sizeof(b))];
-}
-
-char c99_6_7_8_p32_example8_s1[] = "abc",
- c99_6_7_8_p32_example8_t1[3] = "abc";
-char c99_6_7_8_p32_example8_s2[] = { 'a', 'b', 'c', '\0' },
- c99_6_7_8_p32_example8_t2[3] = { 'a', 'b', 'c' };
-char *c99_6_7_8_p32_example8_p = "abc";
-
-enum { member_one, member_two };
-const char *c99_6_7_8_p33_example9[] = {
- [member_two] = "member two",
- [member_one] = "member one",
-};
-
-struct {
- int quot, rem;
-} c99_6_7_8_p34_example10 = { .quot = 2, .rem = -1 };
-
-struct { int a[3], b; } c99_6_7_8_p35_example11[] =
- { [0].a = {1}, [1].a[0] = 2 };
-
-int c99_6_7_8_p36_example12a[16] = {
- 1, 3, 5, 7, 9, [16-5] = 8, 6, 4, 2, 0
-};
-
-int c99_6_7_8_p36_example12b[8] = {
- 1, 3, 5, 7, 9, [8-5] = 8, 6, 4, 2, 0
-};
-
-union {
- int first_member;
- void *second_member;
- unsigned char any_member;
-} c99_6_7_8_p38_example13 = { .any_member = 42 };
-
-
-/*
- * During initialization of an object of type array of unknown size, the type
- * information on the symbol is updated in-place. Ensure that this happens on
- * a copy of the type.
- *
- * C99 6.7.8p31 example 7
- */
-void
-ensure_array_type_is_not_modified_during_initialization(void)
-{
- typedef int array_of_unknown_size[];
-
- array_of_unknown_size a1 = { 1, 2, 3};
-
- switch (4) {
- case sizeof(array_of_unknown_size):
- /* expect+1: error: duplicate case '0' in switch [199] */
- case 0:
- case 3:
- case 4:
- case 12:
- break;
- }
-
- /* expect+1: error: negative array dimension (-12) [20] */
- typedef int reveal_sizeof_a1[-(int)(sizeof(a1))];
-}
-
-struct point unknown_member_name_beginning = {
- /* expect+1: error: type 'struct point' does not have member 'r' [101] */
- .r = 5,
- .x = 4,
- .y = 3,
-};
-
-struct point unknown_member_name_middle = {
- .x = 4,
- /* expect+1: error: type 'struct point' does not have member 'r' [101] */
- .r = 5,
- .y = 3,
-};
-
-struct point unknown_member_name_end = {
- .x = 4,
- .y = 3,
- /* expect+1: error: type 'struct point' does not have member 'r' [101] */
- .r = 5,
-};
-
-union value {
- int int_value;
- void *pointer_value;
-};
-
-union value unknown_union_member_name_first = {
- /* expect+1: error: type 'union value' does not have member 'unknown_value' [101] */
- .unknown_value = 4,
- .int_value = 3,
-};
-
-union value unknown_union_member_name_second = {
- .int_value = 3,
- /* expect+1: error: type 'union value' does not have member 'unknown_value' [101] */
- .unknown_value = 4,
-};
-
-struct point subscript_designator_on_struct = {
- /* expect+1: error: syntax error 'designator '[...]' is only for arrays' [249] */
- [0] = 3,
-};
-
-struct point unknown_member_on_struct = {
- /* expect+1: error: type 'struct point' does not have member 'member' [101] */
- .member[0][0].member = 4,
-};
-
-struct point unknown_member_on_scalar = {
- /* expect+1: error: syntax error 'scalar type cannot use designator' [249] */
- .x.y.z = 5,
-};
-
-struct {
- int:16;
- /* expect+2: warning: 'struct <unnamed>' has no named members [65] */
- /* expect+1: error: cannot initialize struct/union with no named member [179] */
-} struct_with_only_unnamed_members = {
- 123,
-};
-
-union {
- int:16;
- /* expect+2: warning: 'union <unnamed>' has no named members [65] */
- /* expect+1: error: cannot initialize struct/union with no named member [179] */
-} union_with_only_unnamed_members = {
- 123,
-};
-
-int designator_for_scalar = {
- /* expect+1: error: syntax error 'scalar type cannot use designator' [249] */
- .value = 3,
-};
-
-struct point member_designator_for_scalar_in_struct = {
- /* expect+1: error: syntax error 'scalar type cannot use designator' [249] */
- { .x = 3 },
-};
-struct point subscript_designator_for_scalar_in_struct = {
- /* expect+1: error: syntax error 'designator '[...]' is only for arrays' [249] */
- { [1] = 4 },
-};
-
-
-/* Seen in pcidevs_data.h, variable 'pci_words'. */
-const char string_initialized_with_braced_literal[] = {
- "initializer",
-};
-
-// An array of unknown size containing strings.
-char weekday_names[][4] = {
- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-};
-
-/* nested struct/union initialization */
-struct outer {
- int i;
- char c;
- union inner {
- short us;
- char uc;
- } u;
- char *s;
-} struct_containing_union[] = {
- {
- .s = "foo",
- .c = 'b',
- .u = {
- .uc = 'c'
- }
- },
- {
- .i = 1,
- .c = 'a',
- .u = {
- .us = 2
- }
- },
-};
-
-/*
- * The expansion of the offsetof macro may dereference a null pointer.
- * Such expressions are allowed in initializers for objects with
- * static duration.
- */
-struct offset_and_data {
- unsigned long offset;
- unsigned long data;
-};
-
-struct offset_and_data offset_and_data = {
- (unsigned long)&(((struct offset_and_data *)0)->data),
- 0,
-};
-
-// The size of the array is determined by the maximum index, not by the last
-// one mentioned.
-int arr_11[] = { [10] = 10, [0] = 0 };
-typedef int ctassert_11[-(int)(sizeof(arr_11) / sizeof(arr_11[0]))];
-/* expect-1: error: negative array dimension (-11) [20] */
-
-// Without an explicit subscript designator, the subscript counts up.
-int arr_3[] = { [1] = 1, [0] = 0, 1, 2 };
-typedef int ctassert_3[-(int)(sizeof(arr_3) / sizeof(arr_3[0]))];
-/* expect-1: error: negative array dimension (-3) [20] */
diff --git a/usr.bin/xlint/lint1/d_c99_struct_init.c b/usr.bin/xlint/lint1/d_c99_struct_init.c
deleted file mode 100644
index 0ab1c28860d5..000000000000
--- a/usr.bin/xlint/lint1/d_c99_struct_init.c
+++ /dev/null
@@ -1,25 +0,0 @@
-/* $NetBSD: d_c99_struct_init.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_struct_init.c"
-
-/* lint1-extra-flags: -X 351 */
-
-/* C99 struct initialization */
-struct {
- int i;
- char *s;
-} c[] = {
- {
- .i = 2,
- },
- {
- .s = "foo"
- },
- {
- .i = 1,
- .s = "bar"
- },
- {
- .s = "foo",
- .i = -1
- },
-};
diff --git a/usr.bin/xlint/lint1/d_c99_union_init1.c b/usr.bin/xlint/lint1/d_c99_union_init1.c
deleted file mode 100644
index 5ec7820f31a7..000000000000
--- a/usr.bin/xlint/lint1/d_c99_union_init1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* $NetBSD: d_c99_union_init1.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_union_init1.c"
-
-/* lint1-extra-flags: -X 351 */
-
-/* GCC-style and C99-style union initialization */
-union {
- int i;
- char *s;
-} c[] = {
- { i: 1 }, /* GCC-style */
- { s: "foo" }, /* GCC-style */
- { .i = 1 }, /* C99-style */
- { .s = "foo" } /* C99-style */
-};
diff --git a/usr.bin/xlint/lint1/d_c99_union_init2.c b/usr.bin/xlint/lint1/d_c99_union_init2.c
deleted file mode 100644
index b4085a1b01ea..000000000000
--- a/usr.bin/xlint/lint1/d_c99_union_init2.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* $NetBSD: d_c99_union_init2.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_union_init2.c"
-
-/* lint1-extra-flags: -X 351 */
-
-/* C99 union initialization */
-union {
- int i[10];
- short s;
-} c[] = {
- { s: 2 },
- { i: { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } },
-};
diff --git a/usr.bin/xlint/lint1/d_c99_union_init3.c b/usr.bin/xlint/lint1/d_c99_union_init3.c
deleted file mode 100644
index 7b62e6db00e1..000000000000
--- a/usr.bin/xlint/lint1/d_c99_union_init3.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* $NetBSD: d_c99_union_init3.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_union_init3.c"
-
-/* lint1-extra-flags: -X 351 */
-
-/* C99 struct initialization */
-struct {
- int i[10];
- char *s;
-} c[] = {
- {
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
- "foo"
- },
-};
diff --git a/usr.bin/xlint/lint1/d_c99_union_init4.c b/usr.bin/xlint/lint1/d_c99_union_init4.c
deleted file mode 100644
index 59f99c14fe89..000000000000
--- a/usr.bin/xlint/lint1/d_c99_union_init4.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* $NetBSD: d_c99_union_init4.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_union_init4.c"
-
-/* lint1-extra-flags: -X 351 */
-
-/* test .data.l[x] */
-typedef struct {
- int type;
- union {
- char b[20];
- short s[10];
- long l[5];
- } data;
-} foo;
-
-
-foo bar = {
- .type = 3,
- .data.l[0] = 4
-};
diff --git a/usr.bin/xlint/lint1/d_c99_union_init5.c b/usr.bin/xlint/lint1/d_c99_union_init5.c
deleted file mode 100644
index 2923840dd201..000000000000
--- a/usr.bin/xlint/lint1/d_c99_union_init5.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* $NetBSD: d_c99_union_init5.c,v 1.2 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c99_union_init5.c"
-
-/*
- * PR bin/20264: lint(1) has problems with named member initialization
- *
- * Has been fixed somewhere between 2005.12.24.20.47.56 and
- * 2006.12.19.19.06.44.
-*/
-
-/* lint1-extra-flags: -X 351 */
-
-union mist {
- char *p;
- int a[1];
-};
-
-union mist xx = {
- .a = { 7 }
-};
diff --git a/usr.bin/xlint/lint1/d_c9x_array_init.c b/usr.bin/xlint/lint1/d_c9x_array_init.c
deleted file mode 100644
index c0604de9e21f..000000000000
--- a/usr.bin/xlint/lint1/d_c9x_array_init.c
+++ /dev/null
@@ -1,11 +0,0 @@
-/* $NetBSD: d_c9x_array_init.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_c9x_array_init.c"
-
-/* lint1-extra-flags: -X 351 */
-
-/* GCC-specific array range initializers */
-int foo[256] = {
- [2] = 1,
- [3] = 2,
- [4 ... 5] = 3
-};
diff --git a/usr.bin/xlint/lint1/d_cast_lhs.c b/usr.bin/xlint/lint1/d_cast_lhs.c
deleted file mode 100644
index 1acf62fe69b9..000000000000
--- a/usr.bin/xlint/lint1/d_cast_lhs.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* $NetBSD: d_cast_lhs.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_cast_lhs.c"
-
-/*
- * Pointer casts had been valid lvalues in GCC before 4.0.
- *
- * https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Lvalues.html#Lvalues
- *
- * C99 6.5.4 "Cast operators" footnote 85 says "A cast does not yield an
- * lvalue".
- */
-
-/* lint1-extra-flags: -X 351 */
-
-struct str {
- int member;
-};
-
-void sink(const void *);
-
-/* ARGSUSED */
-void
-foo(void *p)
-{
- /* expect+2: error: a cast does not yield an lvalue [163] */
- /* expect+1: error: left operand of '=' must be lvalue [114] */
- ((struct str *)p) = 0;
-
- /* expect+2: error: a cast does not yield an lvalue [163] */
- /* expect+1: error: operand of '&' must be lvalue [114] */
- sink(&(const void *)p);
-}
diff --git a/usr.bin/xlint/lint1/d_compound_literals1.c b/usr.bin/xlint/lint1/d_compound_literals1.c
deleted file mode 100644
index 9c9496b412cc..000000000000
--- a/usr.bin/xlint/lint1/d_compound_literals1.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* $NetBSD: d_compound_literals1.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_compound_literals1.c"
-
-/* compound literals */
-
-/* lint1-extra-flags: -X 351 */
-
-struct p {
- short a, b, c, d;
-};
-
-void foo(void)
-{
- struct p me = (struct p){ 1, 2, 3, 4 };
- me.a = me.b;
-}
diff --git a/usr.bin/xlint/lint1/d_compound_literals2.c b/usr.bin/xlint/lint1/d_compound_literals2.c
deleted file mode 100644
index 2e11f4cb48b9..000000000000
--- a/usr.bin/xlint/lint1/d_compound_literals2.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/* $NetBSD: d_compound_literals2.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_compound_literals2.c"
-
-/* compound literals */
-
-/* lint1-extra-flags: -X 351 */
-
-struct p {
- short a, b, c, d;
-} zz = {
- 1, 2, 3, 4
-};
-
-struct p *
-bar(int i)
-{
- static struct p q[10];
- return &q[i];
-}
-
-void foo(void)
-{
- *bar(1) = (struct p){ 1, 2, 3, 4 };
-}
diff --git a/usr.bin/xlint/lint1/d_constant_conv1.c b/usr.bin/xlint/lint1/d_constant_conv1.c
deleted file mode 100644
index 114765720e40..000000000000
--- a/usr.bin/xlint/lint1/d_constant_conv1.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/* $NetBSD: d_constant_conv1.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_constant_conv1.c"
-
-/* Flag information-losing constant conversion in argument lists */
-
-/* lint1-extra-flags: -X 351 */
-
-int f(unsigned int);
-
-void
-should_fail()
-{
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
- f(-1);
-}
diff --git a/usr.bin/xlint/lint1/d_constant_conv2.c b/usr.bin/xlint/lint1/d_constant_conv2.c
deleted file mode 100644
index cbcbc1fcd8a0..000000000000
--- a/usr.bin/xlint/lint1/d_constant_conv2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-/* $NetBSD: d_constant_conv2.c,v 1.7 2023/07/09 10:42:07 rillig Exp $ */
-# 3 "d_constant_conv2.c"
-
-/* Flag information-losing constant conversion in argument lists */
-
-/*
- * Before tree.c 1.427 from 2022-04-15, lint warned about conversions due to
- * prototype even in C99 mode, which is far away from traditional C to make
- * non-prototype functions an issue.
- */
-/* lint1-flags: -h -w */
-/* lint1-extra-flags: -X 351 */
-
-int f(unsigned int);
-
-void
-should_fail(void)
-{
- /* expect+1: warning: argument 1 is converted from 'double' to 'unsigned int' due to prototype [259] */
- f(2.1);
-}
diff --git a/usr.bin/xlint/lint1/d_cvt_constant.c b/usr.bin/xlint/lint1/d_cvt_constant.c
deleted file mode 100644
index ddff673c54a5..000000000000
--- a/usr.bin/xlint/lint1/d_cvt_constant.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* $NetBSD: d_cvt_constant.c,v 1.6 2022/01/15 14:22:03 rillig Exp $ */
-# 3 "d_cvt_constant.c"
-
-/* the second assignment assumes failed before */
-int
-main(void)
-{
- /* expect+1: warning: 'x' set but not used in function 'main' [191] */
- double x = 1;
- int foo = 0;
- if (foo)
- x = 1;
-}
diff --git a/usr.bin/xlint/lint1/d_cvt_in_ternary.c b/usr.bin/xlint/lint1/d_cvt_in_ternary.c
deleted file mode 100644
index 686ec87425c9..000000000000
--- a/usr.bin/xlint/lint1/d_cvt_in_ternary.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* $NetBSD: d_cvt_in_ternary.c,v 1.3 2021/01/31 14:57:28 rillig Exp $ */
-# 3 "d_cvt_in_ternary.c"
-
-/* CVT node handling in ?: operator */
-typedef unsigned long int size_t;
-struct filecore_direntry {
- unsigned len: 32;
-};
-
-int
-main(void)
-{
- struct filecore_direntry dirent = { 0 };
- size_t uio_resid = 0;
- size_t bytelen = (((dirent.len) < (uio_resid))
- ? (dirent.len)
- : (uio_resid));
- return bytelen;
-}
diff --git a/usr.bin/xlint/lint1/d_decl_old_style_arguments.c b/usr.bin/xlint/lint1/d_decl_old_style_arguments.c
index 1476cd80a349..d511938a05ef 100644
--- a/usr.bin/xlint/lint1/d_decl_old_style_arguments.c
+++ b/usr.bin/xlint/lint1/d_decl_old_style_arguments.c
@@ -9,6 +9,7 @@
void func(int a, int b, int c);
+/* expect+5: warning: function definition for 'func' with identifier list is obsolete in C23 [384] */
/* expect+4: warning: parameter 'num' unused in function 'func' [231] */
/* expect+3: warning: parameter 'ptr' unused in function 'func' [231] */
/* expect+2: warning: parameter 'dbl' unused in function 'func' [231] */
diff --git a/usr.bin/xlint/lint1/d_ellipsis_in_switch.c b/usr.bin/xlint/lint1/d_ellipsis_in_switch.c
deleted file mode 100644
index 21cb23ce1c07..000000000000
--- a/usr.bin/xlint/lint1/d_ellipsis_in_switch.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* $NetBSD: d_ellipsis_in_switch.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_ellipsis_in_switch.c"
-
-/* Using a range in a case label is a GCC extension. */
-
-/* lint1-extra-flags: -X 351 */
-
-int
-x(void)
-{
- int i = 33;
- switch (i) {
- case 1 ... 40:
- break;
- default:
- break;
- }
- return 0;
-}
diff --git a/usr.bin/xlint/lint1/d_gcc_extension.c b/usr.bin/xlint/lint1/d_gcc_extension.c
deleted file mode 100644
index 8c05fd93f1ab..000000000000
--- a/usr.bin/xlint/lint1/d_gcc_extension.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* $NetBSD: d_gcc_extension.c,v 1.7 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_gcc_extension.c"
-
-/*
- * Test that the GCC '__extension__' and '__typeof' are recognized.
- */
-
-/* lint1-extra-flags: -X 351 */
-
-_Bool dbl_isinf(double);
-
-/* extension */
-void
-a(void)
-{
- double __logbw = 1;
- if (__extension__(({
- __typeof((__logbw)) x_ = (__logbw);
- !dbl_isinf((x_));
- })))
- __logbw = 1;
-}
diff --git a/usr.bin/xlint/lint1/d_gcc_func.c b/usr.bin/xlint/lint1/d_gcc_func.c
deleted file mode 100644
index 6d7ef0fdaeb2..000000000000
--- a/usr.bin/xlint/lint1/d_gcc_func.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* $NetBSD: d_gcc_func.c,v 1.4 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_gcc_func.c"
-
-/* gcc __FUNCTION__ */
-
-/* lint1-extra-flags: -X 351 */
-
-void
-foo(const char *p)
-{
- p = __FUNCTION__;
- foo(p);
-}
diff --git a/usr.bin/xlint/lint1/d_gcc_variable_array_init.c b/usr.bin/xlint/lint1/d_gcc_variable_array_init.c
deleted file mode 100644
index fcc2e54e9260..000000000000
--- a/usr.bin/xlint/lint1/d_gcc_variable_array_init.c
+++ /dev/null
@@ -1,14 +0,0 @@
-/* $NetBSD: d_gcc_variable_array_init.c,v 1.4 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_gcc_variable_array_init.c"
-
-/* gcc: variable array initializer */
-
-/* lint1-extra-flags: -X 351 */
-
-void
-foo(int i)
-{
- int array[i];
- while (i--)
- foo(array[i] = 0);
-}
diff --git a/usr.bin/xlint/lint1/d_incorrect_array_size.c b/usr.bin/xlint/lint1/d_incorrect_array_size.c
deleted file mode 100644
index c9599d1211e3..000000000000
--- a/usr.bin/xlint/lint1/d_incorrect_array_size.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/* $NetBSD: d_incorrect_array_size.c,v 1.4 2022/01/15 14:22:03 rillig Exp $ */
-# 3 "d_incorrect_array_size.c"
-
-struct foo {
- /* expect+1: error: negative array dimension (-1) [20] */
- int a[-1];
-};
diff --git a/usr.bin/xlint/lint1/d_init_array_using_string.c b/usr.bin/xlint/lint1/d_init_array_using_string.c
deleted file mode 100644
index 468485589b65..000000000000
--- a/usr.bin/xlint/lint1/d_init_array_using_string.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/* $NetBSD: d_init_array_using_string.c,v 1.14 2023/07/07 06:03:31 rillig Exp $ */
-# 3 "d_init_array_using_string.c"
-
-/*
- * Test initialization of arrays and pointers by string literals.
- */
-
-/* lint1-extra-flags: -X 191,351 */
-
-void sink(const void *);
-
-void
-test_assignment_initialization(void)
-{
- const char *cs_match = "";
- const int *ws_match = L"";
-
- /* expect+1: warning: illegal combination of 'pointer to const char' and 'pointer to int', op 'init' [124] */
- const char *cs_mismatch = L"";
- /* expect+1: warning: illegal combination of 'pointer to const int' and 'pointer to char', op 'init' [124] */
- const int *ws_mismatch = "";
-}
-
-void
-test_pointer_initialization_in_struct(void)
-{
- struct cs_ws {
- const char *cs;
- const int *ws;
- };
-
- struct cs_ws type_match = {
- "",
- L"",
- };
-
- struct cs_ws type_mismatch = {
- /* expect+1: warning: illegal combination of 'pointer to const char' and 'pointer to int', op 'init' [124] */
- L"",
- /* expect+1: warning: illegal combination of 'pointer to const int' and 'pointer to char', op 'init' [124] */
- "",
- };
-
- struct cs_ws extra_braces = {
- { "" },
- { L"" },
- };
-}
-
-
-void
-test_array_initialization_in_struct(void)
-{
- struct cs_ws {
- const char cs[10];
- const int ws[10];
- };
-
- struct cs_ws type_match = {
- "",
- L"",
- };
-
- struct cs_ws type_mismatch = {
- /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to int' [183] */
- L"",
- /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
- "",
- };
-
- struct cs_ws no_terminating_null = {
- "0123456789",
- L"0123456789",
- };
-
- struct cs_ws too_many_characters = {
- /* expect+1: warning: string literal too long (11) for target array (10) [187] */
- "0123456789X",
- /* expect+1: warning: string literal too long (11) for target array (10) [187] */
- L"0123456789X",
- };
-
- struct cs_ws extra_braces = {
- { "" },
- { L"" },
- };
-}
diff --git a/usr.bin/xlint/lint1/d_init_pop_member.c b/usr.bin/xlint/lint1/d_init_pop_member.c
deleted file mode 100644
index a60f020faa6a..000000000000
--- a/usr.bin/xlint/lint1/d_init_pop_member.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* $NetBSD: d_init_pop_member.c,v 1.10 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_init_pop_member.c"
-
-/*
- * Since init.c 1.27 from 2015-07-28 and before init.c 1.178 from 2021-03-29,
- * a bug in memberpop or pop_member led to a wrong error message
- * "undefined struct/union member: capital [101]" in the second and third
- * named initializer.
- */
-
-/* lint1-extra-flags: -X 351 */
-
-struct rgb {
- unsigned red;
- unsigned green;
- unsigned blue;
-};
-
-struct hobbies {
- unsigned dancing: 1;
- unsigned running: 1;
- unsigned swimming: 1;
-};
-
-struct person {
- struct hobbies hobbies;
- struct rgb favorite_color;
-};
-
-struct city {
- struct person mayor;
-};
-
-struct state {
- struct city capital;
-};
-
-void func(void)
-{
- /* expect+1: warning: 'st' set but not used in function 'func' [191] */
- struct state st = {
- .capital.mayor.hobbies.dancing = 1,
- /*
- * Since 2015-07-28:
- * wrong "undefined struct/union member: capital [101]"
- */
- /*
- * Before init.c 1.52 from 2020-01-01:
- * wrong "warning: bit-field initializer does not fit [180]"
- */
- .capital.mayor.favorite_color.green = 0xFF,
- /*
- * Since 2015-07-28:
- * wrong "undefined struct/union member: capital [101]"
- */
- /*
- * Before init.c 1.52 from 2020-01-01:
- * wrong "warning: bit-field initializer does not fit [180]"
- */
- .capital.mayor.favorite_color.red = 0xFF,
- };
-}
diff --git a/usr.bin/xlint/lint1/d_long_double_int.c b/usr.bin/xlint/lint1/d_long_double_int.c
deleted file mode 100644
index 6905252ffe66..000000000000
--- a/usr.bin/xlint/lint1/d_long_double_int.c
+++ /dev/null
@@ -1,13 +0,0 @@
-/* $NetBSD: d_long_double_int.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_long_double_int.c"
-
-/* PR bin/39639: writing "long double" gave "long int" */
-
-/* lint1-extra-flags: -X 351 */
-
-int
-fail(long double *a, long int *b)
-{
- /* expect+1: warning: illegal combination of 'pointer to long double' and 'pointer to long', op '==' [124] */
- return a == b;
-}
diff --git a/usr.bin/xlint/lint1/d_nested_structs.c b/usr.bin/xlint/lint1/d_nested_structs.c
deleted file mode 100644
index a68859689d9b..000000000000
--- a/usr.bin/xlint/lint1/d_nested_structs.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/* $NetBSD: d_nested_structs.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_nested_structs.c"
-
-/* lint1-extra-flags: -X 351 */
-
-/* Nested struct */
-typedef void *EditLine;
-typedef void *History;
-
-typedef struct {
- EditLine *el;
- History *hist;
-} el_mode_t;
-
-struct el_modes_s {
- el_mode_t command;
- el_mode_t string;
- el_mode_t filec;
- el_mode_t mime_enc;
-};
-
-struct el_modes_s elm = {
- .command = { .el = 0, .hist = 0, },
- .string = { .el = 0, .hist = 0, },
- .filec = { .el = 0, .hist = 0, },
-};
diff --git a/usr.bin/xlint/lint1/d_pr_22119.c b/usr.bin/xlint/lint1/d_pr_22119.c
deleted file mode 100644
index 3052205335c7..000000000000
--- a/usr.bin/xlint/lint1/d_pr_22119.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* $NetBSD: d_pr_22119.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_pr_22119.c"
-
-/*
- * https://gnats.netbsd.org/22119
- *
- * Before 2021-02-28, lint crashed in cast() since the target type of the
- * cast is NULL.
-*/
-
-/* lint1-extra-flags: -X 351 */
-
-void
-func1(void)
-{
- void (*f1)(void);
-
- /* expect+1: error: 'p' undefined [99] */
- f1 = (void (*)(void))p;
- /* expect+2: error: function returns illegal type 'function(void) returning pointer to void' [15] */
- /* expect+1: error: invalid cast from 'int' to 'function() returning pointer to function(void) returning pointer to void' [147] */
- f1 = (void *()(void))p; /* crash before 2021-02-28 */
-}
diff --git a/usr.bin/xlint/lint1/d_return_type.c b/usr.bin/xlint/lint1/d_return_type.c
deleted file mode 100644
index 4d998d58c76d..000000000000
--- a/usr.bin/xlint/lint1/d_return_type.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/* $NetBSD: d_return_type.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "d_return_type.c"
-
-/* lint1-extra-flags: -X 351 */
-
-enum A {
- A
-};
-
-enum B {
- B
-};
-
-enum A
-func(enum B arg)
-{
- /* expect+1: warning: function has return type 'enum A' but returns 'enum B' [211] */
- return arg;
-}
diff --git a/usr.bin/xlint/lint1/d_struct_init_nested.c b/usr.bin/xlint/lint1/d_struct_init_nested.c
deleted file mode 100644
index 482f265e2cb1..000000000000
--- a/usr.bin/xlint/lint1/d_struct_init_nested.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* $NetBSD: d_struct_init_nested.c,v 1.8 2023/03/28 14:44:34 rillig Exp $ */
-# 3 "d_struct_init_nested.c"
-
-/*
- * Initialization of a nested struct, in which some parts are initialized
- * from non-constant expressions of the inner struct type.
- *
- * In C99, 6.7.8p13 describes exactly this case.
- */
-
-/* lint1-extra-flags: -X 351 */
-
-typedef enum O1 { O1C = 101 } O1;
-typedef enum O2 { O2C = 102 } O2;
-typedef enum O3 { O3C = 103 } O3;
-typedef enum I1 { I1C = 201 } I1;
-typedef enum I2 { I2C = 202 } I2;
-
-struct Inner1 {
- I1 i1;
-};
-
-struct Outer3Inner1 {
- O1 o1;
- struct Inner1 inner;
- O3 o3;
-};
-
-O1
-funcOuter3Inner1(void)
-{
- struct Inner1 inner = {
- I1C
- };
- struct Outer3Inner1 o3i1 = {
- O1C,
- inner,
- O3C
- };
-
- return o3i1.o1;
-}
-
-struct Inner2 {
- I1 i1;
- I2 i2;
-};
-
-struct Outer3Inner2 {
- O1 o1;
- struct Inner2 inner;
- O3 o3;
-};
-
-O1
-funcOuter3Inner2(void)
-{
- struct Inner2 inner = {
- I1C,
- I2C
- };
- struct Outer3Inner2 o3i2 = {
- O1C,
- inner,
- O3C
- };
- return o3i2.o1;
-}
-
-/*
- * For static storage duration, each initializer expression must be a constant
- * expression.
- */
-struct Inner2 inner = {
- I1C,
- I2C
-};
-struct Outer3Inner2 o3i2 = {
- O1C,
- /* expect+1: error: non-constant initializer [177] */
- inner,
- O3C
-};
diff --git a/usr.bin/xlint/lint1/d_type_conv1.c b/usr.bin/xlint/lint1/d_type_conv1.c
deleted file mode 100644
index 94b3b00a3ceb..000000000000
--- a/usr.bin/xlint/lint1/d_type_conv1.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* $NetBSD: d_type_conv1.c,v 1.7 2023/07/09 10:42:07 rillig Exp $ */
-# 3 "d_type_conv1.c"
-
-/* Flag information-losing type conversion in argument lists */
-
-/*
- * Before tree.c 1.427 from 2022-04-15, lint warned about conversions due to
- * prototype even in C99 mode, which is far away from traditional C to make
- * non-prototype functions an issue.
- */
-/* lint1-flags: -g -h -w */
-/* lint1-extra-flags: -X 351 */
-
-int f(unsigned int);
-
-void
-should_fail(void)
-{
- long long x = 20;
-
- /* expect+1: warning: argument 1 is converted from 'long long' to 'unsigned int' due to prototype [259] */
- f(x);
-}
diff --git a/usr.bin/xlint/lint1/d_type_conv2.c b/usr.bin/xlint/lint1/d_type_conv2.c
deleted file mode 100644
index 5ed647fbd43a..000000000000
--- a/usr.bin/xlint/lint1/d_type_conv2.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* $NetBSD: d_type_conv2.c,v 1.7 2023/07/09 10:42:07 rillig Exp $ */
-# 3 "d_type_conv2.c"
-
-/* Flag information-losing type conversion in argument lists */
-
-/*
- * Before tree.c 1.427 from 2022-04-15, lint warned about conversions due to
- * prototype even in C99 mode, which is far away from traditional C to make
- * non-prototype functions an issue.
- */
-/* lint1-flags: -h -w */
-/* lint1-extra-flags: -X 351 */
-
-int f(float);
-
-void
-should_fail(void)
-{
- double x = 2.0;
-
- /* expect+1: warning: argument 1 is converted from 'double' to 'float' due to prototype [259] */
- f(x);
-}
diff --git a/usr.bin/xlint/lint1/d_type_conv3.c b/usr.bin/xlint/lint1/d_type_conv3.c
deleted file mode 100644
index 5fb5b39748f7..000000000000
--- a/usr.bin/xlint/lint1/d_type_conv3.c
+++ /dev/null
@@ -1,23 +0,0 @@
-/* $NetBSD: d_type_conv3.c,v 1.8 2023/07/09 10:42:07 rillig Exp $ */
-# 3 "d_type_conv3.c"
-
-/* Flag information-losing type conversion in argument lists */
-
-/*
- * Before tree.c 1.427 from 2022-04-15, lint warned about conversions due to
- * prototype even in C99 mode, which is far away from traditional C to make
- * non-prototype functions an issue.
- */
-/* lint1-flags: -g -h -w */
-/* lint1-extra-flags: -X 351 */
-
-int f(unsigned int);
-
-void
-should_fail(void)
-{
-
- /* expect+2: warning: argument 1 is converted from 'long long' to 'unsigned int' due to prototype [259] */
- /* expect+1: warning: conversion of 'long long' to 'unsigned int' is out of range, arg #1 [295] */
- f(0x7fffffffffffffffLL);
-}
diff --git a/usr.bin/xlint/lint1/d_typename_as_var.c b/usr.bin/xlint/lint1/d_typename_as_var.c
deleted file mode 100644
index 340b6a3d2a99..000000000000
--- a/usr.bin/xlint/lint1/d_typename_as_var.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* $NetBSD: d_typename_as_var.c,v 1.2 2021/01/31 14:39:31 rillig Exp $ */
-# 3 "d_typename_as_var.c"
-
-typedef char h[10];
-
-typedef struct {
- int i;
- char *c;
-} fh;
-
-struct foo {
- fh h;
- struct {
- int x;
- int y;
- } fl;
-};
diff --git a/usr.bin/xlint/lint1/d_zero_sized_arrays.c b/usr.bin/xlint/lint1/d_zero_sized_arrays.c
deleted file mode 100644
index 05e4fbfc7d00..000000000000
--- a/usr.bin/xlint/lint1/d_zero_sized_arrays.c
+++ /dev/null
@@ -1,6 +0,0 @@
-/* $NetBSD: d_zero_sized_arrays.c,v 1.3 2021/01/31 14:57:28 rillig Exp $ */
-# 3 "d_zero_sized_arrays.c"
-
-struct foo {
- int a[0];
-};
diff --git a/usr.bin/xlint/lint1/decl.c b/usr.bin/xlint/lint1/decl.c
index 0b26f51c4486..c9dd94bf5f8f 100644
--- a/usr.bin/xlint/lint1/decl.c
+++ b/usr.bin/xlint/lint1/decl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.26 2023/08/01 19:52:15 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.36 2025/09/14 12:27:42 rillig Exp $ */
# 3 "decl.c"
/*
@@ -68,7 +68,7 @@ declarators(void)
/* expect+1: warning: converting 'pointer to char' to incompatible 'pointer to double' for argument 1 [153] */
sink(pc);
- /* expect+1: warning: illegal combination of pointer 'pointer to double' and integer 'char', arg #1 [154] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to double' and integer 'char', arg #1 [154] */
sink(c);
/* expect+1: warning: converting 'pointer to pointer to char' to incompatible 'pointer to double' for argument 1 [153] */
sink(ppc);
@@ -169,10 +169,10 @@ __thread int thread_int;
/* expect+1: error: syntax error 'int' [249] */
__thread__ int thread_int;
-/* expect+4: error: old-style declaration; add 'int' [1] */
-/* expect+2: warning: static function 'cover_func_declarator' unused [236] */
static
+/* expect+1: warning: static function 'cover_func_declarator' unused [236] */
cover_func_declarator(void)
+/* expect+1: error: old-style declaration; add 'int' [1] */
{
}
@@ -224,7 +224,7 @@ symbol_type_in_unnamed_bit_field_member(void)
struct s {
// Since there is no name in the declarator, the next symbol
// after the ':' must not be interpreted as a member name, but
- // instead as a variable, type or function (FVFT).
+ // instead as a variable, type or function (SK_VCFT).
unsigned int :bits;
int named_member;
};
@@ -241,3 +241,103 @@ get_x(struct point3d { struct point3d_number { int v; } x, y, z; } arg)
static struct point3d_number z;
return arg.x.v + local.x.v + z.v;
}
+
+// Expressions of the form '(size_t)&null_ptr->member' are used by several
+// C implementations to implement the offsetof macro.
+void
+offsetof_on_array_member(void)
+{
+ typedef struct {
+ int padding, plain, arr[2];
+ } s1;
+
+ // Bit-fields must have a constant number of bits.
+ struct s2 {
+ unsigned int off_plain:(unsigned long)&((s1 *)0)->plain;
+ unsigned int off_arr:(unsigned long)&((s1 *)0)->arr;
+ unsigned int off_arr_0:(unsigned long)&((s1 *)0)->arr[0];
+ unsigned int off_arr_3:(unsigned long)&((s1 *)0)->arr[3];
+ };
+
+ // Arrays may be variable-width, but the diagnostic reveals the size.
+ /* expect+1: error: negative array dimension (-4) [20] */
+ typedef int off_plain[-(int)(unsigned long)&((s1 *)0)->plain];
+ /* expect+1: error: negative array dimension (-8) [20] */
+ typedef int off_arr[-(int)(unsigned long)&((s1 *)0)->arr];
+ /* expect+1: error: negative array dimension (-8) [20] */
+ typedef int off_arr_0[-(int)(unsigned long)&((s1 *)0)->arr[0]];
+ /* expect+1: error: negative array dimension (-20) [20] */
+ typedef int off_arr_3[-(int)(unsigned long)&((s1 *)0)->arr[3]];
+}
+
+/* PR bin/39639: writing "long double" gave "long int" */
+int
+long_double_vs_long_int(long double *a, long int *b)
+{
+ /* expect+1: warning: invalid combination of 'pointer to long double' and 'pointer to long', op '==' [124] */
+ return a == b;
+}
+
+struct zero_sized_array {
+ int member[0];
+};
+
+void
+type_name_as_member_name(void)
+{
+ typedef char h[10];
+
+ typedef struct {
+ int i;
+ char *c;
+ } fh;
+
+ struct foo {
+ fh h;
+ struct {
+ int x;
+ int y;
+ } fl;
+ };
+}
+
+
+// When query 16 is not enabled, don't produce a 'previous declaration' message
+// without a preceding main diagnostic.
+static void static_function(void) __attribute__((__used__));
+
+// The definition is without 'static'.
+void
+static_function(void)
+{
+}
+
+
+typedef void (*fprint_function)(int, const char *, ...);
+typedef fprint_function (*change_logger)
+ (fprint_function, fprint_function, fprint_function, fprint_function);
+
+// Provoke a long type name to test reallocation in type_name.
+/* expect+1: error: redeclaration of 'static_function' with type 'function(pointer to function(pointer to function(int, pointer to const char, ...) returning void, pointer to function(int, pointer to const char, ...) returning void, pointer to function(int, pointer to const char, ...) returning void, pointer to function(int, pointer to const char, ...) returning void) returning pointer to function(int, pointer to const char, ...) returning void) returning void', expected 'function(void) returning void' [347] */
+void static_function(change_logger);
+
+
+void no_prototype_declaration();
+void prototype_declaration(void);
+
+// TODO: Warn about the missing 'void', for C99 and later.
+void
+no_prototype_definition()
+{
+}
+
+void
+prototype_definition(void)
+{
+}
+
+/* These integer overflows in '<<' expressions are detected by KUBSAN. */
+/* expect+1: warning: constant -0x8000000000000000 too large for 'int' [56] */
+typedef int shl_overflow_positive[1LL << 32 << 31];
+/* expect+1: warning: constant -0x8000000000000000 too large for 'int' [56] */
+typedef int shl_overflow_negative[-1LL << 32 << 31];
diff --git a/usr.bin/xlint/lint1/decl_arg.c b/usr.bin/xlint/lint1/decl_arg.c
index 33b518d536c4..2762e8ee2a9b 100644
--- a/usr.bin/xlint/lint1/decl_arg.c
+++ b/usr.bin/xlint/lint1/decl_arg.c
@@ -1,4 +1,4 @@
-/* $NetBSD: decl_arg.c,v 1.12 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: decl_arg.c,v 1.17 2025/01/03 03:14:47 rillig Exp $ */
# 3 "decl_arg.c"
/*
@@ -23,15 +23,16 @@ void type_qualifier_pointer(const number *const);
/*
* Just some unrealistic coverage for the grammar rule 'arg_declaration'.
*/
-/* expect+6: warning: parameter 'an_int' unused in function 'old_style' [231] */
-/* expect+5: warning: parameter 'a_const_int' unused in function 'old_style' [231] */
-/* expect+4: warning: parameter 'a_number' unused in function 'old_style' [231] */
-/* expect+3: warning: parameter 'a_function' unused in function 'old_style' [231] */
-/* expect+2: warning: parameter 'a_struct' unused in function 'old_style' [231] */
extern void
+/* expect+6: warning: function definition for 'old_style' with identifier list is obsolete in C23 [384] */
+/* expect+5: warning: parameter 'an_int' unused in function 'old_style' [231] */
+/* expect+4: warning: parameter 'a_const_int' unused in function 'old_style' [231] */
+/* expect+3: warning: parameter 'a_number' unused in function 'old_style' [231] */
+/* expect+2: warning: parameter 'a_function' unused in function 'old_style' [231] */
+/* expect+1: warning: parameter 'a_struct' unused in function 'old_style' [231] */
old_style(an_int, a_const_int, a_number, a_function, a_struct)
-/* expect+2: warning: empty declaration [2] */
-/* expect+1: error: only 'register' is valid as storage class in parameter [9] */
+/* expect+2: error: only 'register' is valid as storage class in parameter [9] */
+/* expect+1: warning: empty declaration [2] */
static;
/* expect+1: error: syntax error '"' [249] */
static "error";
@@ -61,6 +62,7 @@ struct a_struct { int member; } a_struct;
* 'notype_direct_declarator'.
*/
extern int
+/* expect+1: warning: function definition for 'cover_notype_direct_decl' with identifier list is obsolete in C23 [384] */
cover_notype_direct_decl(arg)
int arg;
/* expect+1: error: declared parameter 'name' is missing [53] */
@@ -71,8 +73,8 @@ const (parenthesized_name);
const array[];
/* expect+1: error: declared parameter 'array_size' is missing [53] */
const array_size[1+1+1];
-/* expect+2: error: declared parameter 'multi_array' is missing [53] */
-/* expect+1: error: null dimension [17] */
+/* expect+2: error: null dimension [17] */
+/* expect+1: error: declared parameter 'multi_array' is missing [53] */
const multi_array[][][][][][];
/* expect+1: error: declared parameter 'function' is missing [53] */
const function(void);
@@ -95,10 +97,30 @@ const
return arg;
}
-void test_varargs_attribute(
+// The attribute 'unused' belongs to the parameter.
+// The attribute 'format' belongs to the function type.
+void
+param_func_attr_unused(
void (*pr)(const char *, ...)
+ __attribute__((__unused__))
__attribute__((__format__(__printf__, 1, 2)))
-);
+)
+{
+}
+
+// The attribute 'unused' belongs to the parameter.
+// The attribute 'format' belongs to the function type.
+void
+param_func_attr_printf(
+ void (*pr)(const char *, ...)
+ __attribute__((__unused__))
+ __attribute__((__format__(__printf__, 1, 2)))
+)
+{
+ // GCC and Clang already warn about the malformed format string,
+ // so there is nothing left to do for lint.
+ pr("%");
+}
/*
* XXX: To cover the grammar rule 'direct_notype_param_decl', the parameters
@@ -135,6 +157,7 @@ void cover_asm_or_symbolrename_symbolrename(void)
double
+/* expect+1: warning: function definition for 'f' with identifier list is obsolete in C23 [384] */
f(e, s, r, a, t, n)
/* expect+1: error: only 'register' is valid as storage class in parameter [9] */
extern double e;
diff --git a/usr.bin/xlint/lint1/decl_direct_abstract.c b/usr.bin/xlint/lint1/decl_direct_abstract.c
index d06183ff59a9..5b6aa627f5b5 100644
--- a/usr.bin/xlint/lint1/decl_direct_abstract.c
+++ b/usr.bin/xlint/lint1/decl_direct_abstract.c
@@ -1,4 +1,4 @@
-/* $NetBSD: decl_direct_abstract.c,v 1.10 2023/08/02 21:11:35 rillig Exp $ */
+/* $NetBSD: decl_direct_abstract.c,v 1.12 2024/01/28 08:17:27 rillig Exp $ */
# 3 "decl_direct_abstract.c"
/*
@@ -57,7 +57,7 @@ function_returning_pointer(void)
{
// GCC says 'error: cast specifies function type'.
// Clang says 'char (short *(*)(long))'.
- /* expect+1: error: invalid cast from 'struct incompatible' to 'function(pointer to function(long) returning pointer to short) returning char' [147] */
+ /* expect+1: ... 'function(pointer to function(long) returning pointer to short) returning char' ... */
x = (char(short *(long)))x;
/* expect+1: warning: nested 'extern' declaration of 'f2' [352] */
@@ -215,3 +215,12 @@ int prototype_named_32_return_04[-1000 - (int)sizeof(a04(a32 arg))];
/* expect+2: error: cannot take size/alignment of function type 'function(struct typedef a32) returning struct typedef a08' [144] */
/* expect+1: error: negative array dimension (-1000) [20] */
int prototype_named_32_return_08[-1000 - (int)sizeof(a08(a32 arg))];
+
+void
+abstract_decl_param_list_with_attributes(void)
+{
+ typedef int unspecified_parameters(void (*)() __attribute__(()));
+ typedef int no_parameters(void (*)(void) __attribute__(()));
+ typedef int single_parameter(void (*)(int) __attribute__(()));
+ typedef int several_parameters(void (*)(int, int) __attribute__(()));
+}
diff --git a/usr.bin/xlint/lint1/decl_enum.c b/usr.bin/xlint/lint1/decl_enum.c
index e8e522e9c220..a23c0e761a9c 100644
--- a/usr.bin/xlint/lint1/decl_enum.c
+++ b/usr.bin/xlint/lint1/decl_enum.c
@@ -1,10 +1,22 @@
-/* $NetBSD: decl_enum.c,v 1.4 2023/06/30 21:39:54 rillig Exp $ */
+/* $NetBSD: decl_enum.c,v 1.6 2024/10/29 20:48:31 rillig Exp $ */
# 3 "decl_enum.c"
/*
* Tests for enum declarations.
*/
+
+// Initializing an enum from a 64-bit value cuts off the upper bits.
+// TIME_MIN thus gets truncated from 0x8000_0000_0000_0000 to 0.
+// TIME_MAX thus gets truncated from 0x7fff_ffff_ffff_ffff to -1.
+enum {
+ /* expect+1: warning: constant -0x8000000000000000 too large for 'int' [56] */
+ TIME_MIN = (long long)(1ULL << 63),
+ /* expect+1: warning: constant 0x7fffffffffffffff too large for 'int' [56] */
+ TIME_MAX = (long long)~(1ULL << 63),
+};
+
+
/* cover 'enumerator_list: error' */
enum {
/* expect+1: error: syntax error 'goto' [249] */
diff --git a/usr.bin/xlint/lint1/decl_struct_member.c b/usr.bin/xlint/lint1/decl_struct_member.c
index d9786af0e354..75b9464cb874 100644
--- a/usr.bin/xlint/lint1/decl_struct_member.c
+++ b/usr.bin/xlint/lint1/decl_struct_member.c
@@ -1,4 +1,4 @@
-/* $NetBSD: decl_struct_member.c,v 1.17 2023/05/22 12:55:04 rillig Exp $ */
+/* $NetBSD: decl_struct_member.c,v 1.20 2025/04/12 15:49:49 rillig Exp $ */
# 3 "decl_struct_member.c"
/* lint1-extra-flags: -X 351 */
@@ -34,7 +34,7 @@ struct cover_begin_type_qualifier_list {
/* cover struct_or_union_specifier: struct_or_union error */
/* expect+1: error: syntax error 'goto' [249] */
struct goto {
- /* expect+1: error: illegal type combination [4] */
+ /* expect+1: error: invalid type combination [4] */
int member;
/* expect+1: error: syntax error '}' [249] */
};
@@ -71,7 +71,7 @@ struct cover_notype_struct_declarator_bit_field {
* int [8]'.
*/
struct array_of_bit_fields {
- /* expect+1: warning: illegal bit-field type 'array[8] of unsigned int' [35] */
+ /* expect+1: warning: invalid bit-field type 'array[8] of unsigned int' [35] */
unsigned int bits[8]: 1;
};
diff --git a/usr.bin/xlint/lint1/emit.c b/usr.bin/xlint/lint1/emit.c
index 0d09a3339f8a..0dd0c09ccc84 100644
--- a/usr.bin/xlint/lint1/emit.c
+++ b/usr.bin/xlint/lint1/emit.c
@@ -1,4 +1,4 @@
-/* $NetBSD: emit.c,v 1.17 2023/05/22 17:53:27 rillig Exp $ */
+/* $NetBSD: emit.c,v 1.18 2024/06/09 16:49:40 rillig Exp $ */
# 3 "emit.c"
/*
@@ -315,3 +315,12 @@ struct compound_expression_in_initializer compound = {
* initializer.
*/
const char array_of_unknown_size[] = "unknown";
+
+int used_and_using(int);
+int only_used(void);
+
+int
+only_using(void)
+{
+ return used_and_using(only_used());
+}
diff --git a/usr.bin/xlint/lint1/emit.exp-ln b/usr.bin/xlint/lint1/emit.exp-ln
index fe7878269df6..0657ab9230a2 100644
--- a/usr.bin/xlint/lint1/emit.exp-ln
+++ b/usr.bin/xlint/lint1/emit.exp-ln
@@ -83,3 +83,9 @@ S emit.c
286 d 0.286 d 8use_vars F0 V
305 d 0.305 d 8compound sT1 34compound_expression_in_initializer
317 d 0.317 d 21array_of_unknown_size A8cC
+
+319 d 0.319 e 14used_and_using F1 I I
+320 d 0.320 e 9only_used F0 I
+325 c 0.325 u 14used_and_using f1 I I
+325 c 0.325 u 9only_used f0 I
+323 d 0.323 dr 10only_using F0 I
diff --git a/usr.bin/xlint/lint1/expr_binary.c b/usr.bin/xlint/lint1/expr_binary.c
index 261db02ba40c..3e58de83075e 100644
--- a/usr.bin/xlint/lint1/expr_binary.c
+++ b/usr.bin/xlint/lint1/expr_binary.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_binary.c,v 1.8 2023/07/14 08:53:52 rillig Exp $ */
+/* $NetBSD: expr_binary.c,v 1.10 2025/04/12 15:49:49 rillig Exp $ */
# 3 "expr_binary.c"
/*
@@ -133,33 +133,103 @@ struct point {
int x, y;
};
+static void
+return_void(void)
+{
+}
+
+static _Bool
+return_bool(void)
+{
+ return sizeof(char) == 1;
+}
+
static struct point
-returning_struct(void)
+return_sou(void)
{
return (struct point){ 0, 0 };
}
-static void
-returning_void(void)
+static int
+return_integer(void)
{
+ return 4;
+}
+
+static double
+return_floating(void)
+{
+ return 3.5;
+}
+
+static char *
+return_pointer(void)
+{
+ return (void *)0;
}
static inline void
op_colon(_Bool cond)
{
+ cond ? return_void() : return_void();
+ /* expect+1: warning: incompatible types 'void' and '_Bool' in conditional [126] */
+ cond ? return_void() : return_bool();
+ /* expect+1: warning: incompatible types 'void' and 'struct point' in conditional [126] */
+ cond ? return_void() : return_sou();
+ /* expect+1: warning: incompatible types 'void' and 'int' in conditional [126] */
+ cond ? return_void() : return_integer();
+ /* expect+1: warning: incompatible types 'void' and 'double' in conditional [126] */
+ cond ? return_void() : return_floating();
+ /* expect+1: warning: incompatible types 'void' and 'pointer to char' in conditional [126] */
+ cond ? return_void() : return_pointer();
+ /* expect+1: warning: incompatible types '_Bool' and 'void' in conditional [126] */
+ cond ? return_bool() : return_void();
+ cond ? return_bool() : return_bool();
+ /* expect+1: error: incompatible types '_Bool' and 'struct point' in conditional [126] */
+ cond ? return_bool() : return_sou();
+ cond ? return_bool() : return_integer();
+ cond ? return_bool() : return_floating();
+ /* expect+1: warning: invalid combination of integer '_Bool' and pointer 'pointer to char', op ':' [123] */
+ cond ? return_bool() : return_pointer();
// FIXME: GCC doesn't warn, as the 'type mismatch' is not wrong.
/* expect+1: warning: incompatible types 'struct point' and 'void' in conditional [126] */
- cond ? returning_struct() : returning_void();
-
- // TODO: Test the other combinations as well.
- // | | void | bool | arith | sou | int | flt | ptr | nullptr |
- // |---------|------|------|-------|-----|-----|-----|-----|---------|
- // | void | ok | | | | | | | |
- // | bool | | ok | | | | | | |
- // | arith | | | ok | | | | | |
- // | sou | | | | ok | | | | |
- // | int | | | | | | | ok | |
- // | flt | | | | | | | | |
- // | ptr | | | | | ok | | | ok |
- // | nullptr | | | | | | | ok | |
+ cond ? return_sou() : return_void();
+ /* expect+1: error: incompatible types 'struct point' and '_Bool' in conditional [126] */
+ cond ? return_sou() : return_bool();
+ cond ? return_sou() : return_sou();
+ /* expect+1: error: incompatible types 'struct point' and 'int' in conditional [126] */
+ cond ? return_sou() : return_integer();
+ /* expect+1: error: incompatible types 'struct point' and 'double' in conditional [126] */
+ cond ? return_sou() : return_floating();
+ /* expect+1: error: incompatible types 'struct point' and 'pointer to char' in conditional [126] */
+ cond ? return_sou() : return_pointer();
+ /* expect+1: warning: incompatible types 'int' and 'void' in conditional [126] */
+ cond ? return_integer() : return_void();
+ cond ? return_integer() : return_bool();
+ /* expect+1: error: incompatible types 'int' and 'struct point' in conditional [126] */
+ cond ? return_integer() : return_sou();
+ cond ? return_integer() : return_integer();
+ cond ? return_integer() : return_floating();
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to char', op ':' [123] */
+ cond ? return_integer() : return_pointer();
+ /* expect+1: warning: incompatible types 'double' and 'void' in conditional [126] */
+ cond ? return_floating() : return_void();
+ cond ? return_floating() : return_bool();
+ /* expect+1: error: incompatible types 'double' and 'struct point' in conditional [126] */
+ cond ? return_floating() : return_sou();
+ cond ? return_floating() : return_integer();
+ cond ? return_floating() : return_floating();
+ /* expect+1: error: incompatible types 'double' and 'pointer to char' in conditional [126] */
+ cond ? return_floating() : return_pointer();
+ /* expect+1: warning: incompatible types 'pointer to char' and 'void' in conditional [126] */
+ cond ? return_pointer() : return_void();
+ /* expect+1: warning: invalid combination of pointer 'pointer to char' and integer '_Bool', op ':' [123] */
+ cond ? return_pointer() : return_bool();
+ /* expect+1: error: incompatible types 'pointer to char' and 'struct point' in conditional [126] */
+ cond ? return_pointer() : return_sou();
+ /* expect+1: warning: invalid combination of pointer 'pointer to char' and integer 'int', op ':' [123] */
+ cond ? return_pointer() : return_integer();
+ /* expect+1: error: incompatible types 'pointer to char' and 'double' in conditional [126] */
+ cond ? return_pointer() : return_floating();
+ cond ? return_pointer() : return_pointer();
}
diff --git a/usr.bin/xlint/lint1/expr_cast.c b/usr.bin/xlint/lint1/expr_cast.c
index 1595a3cb3341..7a0e00d1efed 100644
--- a/usr.bin/xlint/lint1/expr_cast.c
+++ b/usr.bin/xlint/lint1/expr_cast.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_cast.c,v 1.5 2023/08/06 19:44:50 rillig Exp $ */
+/* $NetBSD: expr_cast.c,v 1.7 2025/04/12 15:49:49 rillig Exp $ */
# 3 "expr_cast.c"
/*
@@ -31,3 +31,50 @@ cast(void)
/* expect+1: error: function 'cast' expects to return value [214] */
return (struct S)local;
}
+
+/*
+ * https://gnats.netbsd.org/22119
+ *
+ * Before 2021-02-28, lint crashed in cast() since the target type of the
+ * cast is NULL.
+*/
+void
+cast_from_error(void)
+{
+ void (*f1)(void);
+
+ /* expect+1: error: 'p' undefined [99] */
+ f1 = (void (*)(void))p;
+ /* expect+2: error: function returns invalid type 'function(void) returning pointer to void' [15] */
+ /* expect+1: error: invalid cast from 'int' to 'function() returning pointer to function(void) returning pointer to void' [147] */
+ f1 = (void *()(void))p; /* crash before 2021-02-28 */
+}
+
+/*
+ * Pointer casts had been valid lvalues in GCC before 4.0.
+ *
+ * https://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Lvalues.html#Lvalues
+ *
+ * C99 6.5.4 "Cast operators" footnote 85 says "A cast does not yield an
+ * lvalue".
+ */
+
+void take_ptr(const void *);
+
+void *
+lvalue_cast(void *p)
+{
+ struct str {
+ int member;
+ };
+
+ /* expect+2: error: a cast does not yield an lvalue [163] */
+ /* expect+1: error: left operand of '=' must be lvalue [114] */
+ ((struct str *)p) = 0;
+
+ /* expect+2: error: a cast does not yield an lvalue [163] */
+ /* expect+1: error: operand of '&' must be lvalue [114] */
+ take_ptr(&(const void *)p);
+
+ return p;
+}
diff --git a/usr.bin/xlint/lint1/expr_fold.c b/usr.bin/xlint/lint1/expr_fold.c
index 137acc63d6dc..4a1cd234c9ee 100644
--- a/usr.bin/xlint/lint1/expr_fold.c
+++ b/usr.bin/xlint/lint1/expr_fold.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_fold.c,v 1.10 2023/07/09 11:01:27 rillig Exp $ */
+/* $NetBSD: expr_fold.c,v 1.17 2025/04/10 20:37:48 rillig Exp $ */
# 3 "expr_fold.c"
/*
@@ -59,20 +59,19 @@ fold_uminus(void)
/* The '-' is an operator, it is not part of the integer constant. */
take_int(-2147483648);
- /* expect+2: warning: operator '+' produces integer overflow [141] */
- /* expect+1: warning: operator '-' produces integer overflow [141] */
+ /* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */
take_int(-(2147483647 + 1));
- /* expect+1: warning: operator '-' produces integer overflow [141] */
+ /* expect+1: warning: '-(-2147483648)' overflows 'int' [141] */
take_int(-(-2147483647 - 1));
/* expect+1: warning: conversion of 'long' to 'int' is out of range, arg #1 [295] */
take_int(-(4294967295));
take_uint(-(0));
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -2147483647 to unsigned type 'unsigned int', arg #1 [296] */
take_uint(-(2147483647));
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -2147483648 to unsigned type 'unsigned int', arg #1 [296] */
take_uint(-(2147483648));
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -4294967295 to unsigned type 'unsigned int', arg #1 [296] */
take_uint(-(4294967295));
}
@@ -86,13 +85,13 @@ fold_compl(void)
/* expect+1: warning: conversion of 'long' to 'int' is out of range, arg #1 [295] */
take_int(~(4294967295));
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -1 to unsigned type 'unsigned int', arg #1 [296] */
take_uint(~(0));
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -2147483648 to unsigned type 'unsigned int', arg #1 [296] */
take_uint(~(2147483647));
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -2147483649 to unsigned type 'unsigned int', arg #1 [296] */
take_uint(~(2147483648));
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -4294967296 to unsigned type 'unsigned int', arg #1 [296] */
take_uint(~(4294967295));
}
@@ -100,23 +99,21 @@ void
fold_mult(void)
{
take_int(32767 * 65536);
- /* expect+1: warning: operator '*' produces integer overflow [141] */
+ /* expect+1: warning: '32768 * 65536' overflows 'int' [141] */
take_int(32768 * 65536);
- /* expect+1: warning: operator '*' produces integer overflow [141] */
+ /* expect+1: warning: '65536 * 65536' overflows 'int' [141] */
take_int(65536 * 65536);
take_uint(32767 * 65536U);
take_uint(32768 * 65536U);
- /* expect+1: warning: operator '*' produces integer overflow [141] */
+ /* expect+1: warning: '65536 * 65536' overflows 'unsigned int' [141] */
take_uint(65536 * 65536U);
}
void
fold_div(void)
{
- /* expect+3: error: division by 0 [139] */
- /* XXX: The following message is redundant. */
- /* expect+1: warning: operator '/' produces integer overflow [141] */
+ /* expect+1: error: division by 0 [139] */
take_int(0 / 0);
/* expect+1: warning: conversion of 'long' to 'int' is out of range, arg #1 [295] */
@@ -141,13 +138,13 @@ fold_mod(void)
void
fold_plus(void)
{
- /* expect+1: warning: operator '+' produces integer overflow [141] */
+ /* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */
take_int(2147483647 + 1);
/* Assume two's complement, so no overflow. */
take_int(-2147483647 + -1);
- /* expect+1: warning: operator '+' produces integer overflow [141] */
+ /* expect+1: warning: '-2147483647 + -2' overflows 'int' [141] */
take_int(-2147483647 + -2);
/*
@@ -164,28 +161,27 @@ fold_plus(void)
void
fold_minus(void)
{
- /* expect+1: warning: operator '-' produces integer overflow [141] */
+ /* expect+1: warning: '2147483647 - -1' overflows 'int' [141] */
take_int(2147483647 - -1);
/* Assume two's complement. */
take_int(-2147483647 - 1);
- /* expect+1: warning: operator '-' produces integer overflow [141] */
+ /* expect+1: warning: '-2147483647 - 2' overflows 'int' [141] */
take_int(-2147483647 - 2);
take_int(0 - 2147483648);
- /* expect+1: warning: operator '-' produces integer overflow [141] */
+ /* expect+1: warning: '0 - 2147483648' overflows 'unsigned int' [141] */
take_uint(0 - 2147483648U);
}
void
fold_shl(void)
{
- /* expect+1: warning: operator '<<' produces integer overflow [141] */
+ /* expect+1: warning: '16777216 << 24' overflows 'int' [141] */
take_int(1 << 24 << 24);
- /* expect+1: warning: operator '<<' produces integer overflow [141] */
+ /* expect+1: warning: '16777216 << 24' overflows 'unsigned int' [141] */
take_uint(1U << 24 << 24);
- /* FIXME: undefined behavior in 'fold' at 'uint64_t << 104'. */
/* expect+1: warning: shift amount 104 is greater than bit-size 32 of 'unsigned int' [122] */
take_uint(1U << 24 << 104);
}
@@ -197,7 +193,6 @@ fold_shr(void)
take_int(16777216 >> 25);
- /* FIXME: undefined behavior in 'fold' at 'uint64_t >> 104'. */
/* expect+1: warning: shift amount 104 is greater than bit-size 32 of 'int' [122] */
take_int(16777216 >> 104);
}
@@ -280,7 +275,6 @@ fold_bitor(void)
*/
struct ctassert5_struct {
unsigned int member:
- /*CONSTCOND*/
0xfffffffeU
<=
((1ULL << 63) + 1 < 1 ? ~(1ULL << 63) : ~0ULL) / 0xfffffe00U
@@ -296,7 +290,6 @@ struct ctassert5_struct {
void
unary_minus_overflow(unsigned long long val)
{
- /* expect+1: warning: operator '-' produces integer overflow [141] */
if (val > -(unsigned long long)(-0x7fffffffffffffffL - 1))
return;
}
diff --git a/usr.bin/xlint/lint1/expr_fold_strict_bool.c b/usr.bin/xlint/lint1/expr_fold_strict_bool.c
index 3c05d8a8a4fc..a2a399dcced9 100644
--- a/usr.bin/xlint/lint1/expr_fold_strict_bool.c
+++ b/usr.bin/xlint/lint1/expr_fold_strict_bool.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_fold_strict_bool.c,v 1.2 2021/08/22 21:17:04 rillig Exp $ */
+/* $NetBSD: expr_fold_strict_bool.c,v 1.4 2025/04/12 15:49:49 rillig Exp $ */
# 3 "expr_fold_strict_bool.c"
/*
@@ -9,7 +9,6 @@
*/
/* lint1-extra-flags: -T */
-/* lint1-only-if: lp64 */
typedef long long int64_t;
typedef unsigned long long uint64_t;
@@ -17,15 +16,15 @@ typedef unsigned long long uint64_t;
struct fold_64_bit {
_Bool lt_signed_small_ok: -3LL < 1LL ? 1 : -1;
- /* expect+1: error: illegal bit-field size: 255 [36] */
+ /* expect+1: error: invalid bit-field size: 255 [36] */
_Bool lt_signed_small_bad: 1LL < -3LL ? 1 : -1;
_Bool lt_signed_big_ok: (int64_t)(1ULL << 63) < 1LL ? 1 : -1;
- /* expect+1: error: illegal bit-field size: 255 [36] */
+ /* expect+1: error: invalid bit-field size: 255 [36] */
_Bool lt_signed_big_bad: 1LL < (int64_t)(1ULL << 63) ? 1 : -1;
_Bool lt_unsigned_small_ok: 1ULL < 3ULL ? 1 : -1;
- /* expect+1: error: illegal bit-field size: 255 [36] */
+ /* expect+1: error: invalid bit-field size: 255 [36] */
_Bool lt_unsigned_small_bad: 3ULL < 1ULL ? 1 : -1;
/*
@@ -36,6 +35,6 @@ struct fold_64_bit {
* default mode, or '_Bool' in strict bool mode.
*/
_Bool lt_unsigned_big_ok: 1ULL < 1ULL << 63 ? 1 : -1;
- /* expect+1: error: illegal bit-field size: 255 [36] */
+ /* expect+1: error: invalid bit-field size: 255 [36] */
_Bool lt_unsigned_big_bad: 1ULL << 63 < 1ULL ? 1 : -1;
};
diff --git a/usr.bin/xlint/lint1/expr_precedence.c b/usr.bin/xlint/lint1/expr_precedence.c
index b264b92c0335..20261091d21c 100644
--- a/usr.bin/xlint/lint1/expr_precedence.c
+++ b/usr.bin/xlint/lint1/expr_precedence.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_precedence.c,v 1.11 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: expr_precedence.c,v 1.12 2024/05/01 07:40:11 rillig Exp $ */
# 3 "expr_precedence.c"
/*
@@ -20,8 +20,9 @@ int init_error = 3, 4;
int init_syntactically_ok = var = 1 ? 2 : 3;
/*
- * The arguments of __attribute__ must be constant-expression, as assignments
- * don't make sense at that point.
+ * The arguments of __attribute__ must be constant-expression, but for
+ * simplicity of implementation, they are parsed just like function arguments,
+ * even though this allows assignment-expression.
*/
void __attribute__((format(printf,
/*
@@ -32,7 +33,6 @@ void __attribute__((format(printf,
*
* See lex.c, function 'search', keyword 'in_gcc_attribute'.
*/
- /* expect+1: error: syntax error '=' [249] */
var = 1,
/* Syntactically ok, must be a constant expression though. */
var > 0 ? 2 : 1)))
diff --git a/usr.bin/xlint/lint1/expr_promote.c b/usr.bin/xlint/lint1/expr_promote.c
index a7af50bf11ec..35d7895a8063 100644
--- a/usr.bin/xlint/lint1/expr_promote.c
+++ b/usr.bin/xlint/lint1/expr_promote.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_promote.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: expr_promote.c,v 1.5 2024/11/05 04:53:28 rillig Exp $ */
# 3 "expr_promote.c"
/*
@@ -38,7 +38,7 @@ caller(struct arithmetic_types *arg)
{
/* See expr_promote.exp-ln for the resulting types. */
sink("",
- arg->boolean, /* gets promoted to 'int' */
+ arg->boolean, /* should get promoted to 'int' */
arg->plain_char, /* gets promoted to 'int' */
arg->signed_char, /* gets promoted to 'int' */
arg->unsigned_char, /* gets promoted to 'int' */
@@ -56,7 +56,7 @@ caller(struct arithmetic_types *arg)
arg->float_complex,
arg->double_complex,
arg->long_double_complex,
- arg->enumerator);
+ arg->enumerator); /* should get promoted to 'int' */
}
/*
diff --git a/usr.bin/xlint/lint1/expr_promote.exp-ln b/usr.bin/xlint/lint1/expr_promote.exp-ln
index bcae0835cbb9..fc89f9b087a8 100644
--- a/usr.bin/xlint/lint1/expr_promote.exp-ln
+++ b/usr.bin/xlint/lint1/expr_promote.exp-ln
@@ -1,5 +1,5 @@
-0sexpr_promote.c
-Sexpr_promote.c
-10d0.10e4sinkF2PcCEV
-59c0.59i4sinkf20PcCBIIIIIIuILuLQuQDDlDsXXlXeT331.0.0V
-37d0.37d6callerF1PsT116arithmetic_typesV
+0 s expr_promote.c
+S expr_promote.c
+10 d 0.10 e 4sink F2 PcC E V
+59 c 0.59 i 4sink f20 PcC B I I I I I I uI L uL Q uQ D D lD sX X lX eT3 31.0.0 V
+37 d 0.37 d 6caller F1 PsT1 16arithmetic_types V
diff --git a/usr.bin/xlint/lint1/expr_promote_trad.c b/usr.bin/xlint/lint1/expr_promote_trad.c
index 4f5fc88f19ae..3741cc6ff138 100644
--- a/usr.bin/xlint/lint1/expr_promote_trad.c
+++ b/usr.bin/xlint/lint1/expr_promote_trad.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_promote_trad.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: expr_promote_trad.c,v 1.6 2025/04/12 15:57:26 rillig Exp $ */
# 3 "expr_promote_trad.c"
/*
@@ -10,9 +10,9 @@
sink();
struct arithmetic_types {
- /* _Bool is not available in traditional C */
+ /* _Bool requires C90 or later */
char plain_char;
- /* signed char is not available in traditional C */
+ /* signed char requires C90 or later */
unsigned char unsigned_char;
short signed_short;
unsigned short unsigned_short;
@@ -20,13 +20,13 @@ struct arithmetic_types {
unsigned int unsigned_int;
long signed_long;
unsigned long unsigned_long;
- /* (unsigned) long long is not available in traditional C */
- /* __int128_t is not available in traditional C */
- /* __uint128_t is not available in traditional C */
+ /* (unsigned) long long requires C90 or later */
+ /* __int128_t requires C90 or later */
+ /* __uint128_t requires C90 or later */
float single_floating;
double double_floating;
- /* long double is not available in traditional C */
- /* _Complex is not available in traditional C */
+ /* long double requires C90 or later */
+ /* _Complex requires C90 or later */
enum {
E
} enumerator;
@@ -47,7 +47,7 @@ caller(arg)
arg->unsigned_long,
arg->single_floating, /* gets promoted to 'double' */
arg->double_floating,
- arg->enumerator);
+ arg->enumerator); /* should get promoted to 'int' */
}
/*
diff --git a/usr.bin/xlint/lint1/expr_promote_trad.exp-ln b/usr.bin/xlint/lint1/expr_promote_trad.exp-ln
index ffe7ffc4b2c4..ecefcbd1ee50 100644
--- a/usr.bin/xlint/lint1/expr_promote_trad.exp-ln
+++ b/usr.bin/xlint/lint1/expr_promote_trad.exp-ln
@@ -1,5 +1,5 @@
-0sexpr_promote_trad.c
-Sexpr_promote_trad.c
-10d0.10e4sinkFI
-50c0.50s1""i4sinkf12PCIuIIuIIuILuLDDeT330.0.0I
-35d0.35do6callerf1PsT116arithmetic_typesI
+0 s expr_promote_trad.c
+S expr_promote_trad.c
+10 d 0.10 e 4sink F I
+50 c 0.50 s1"" i 4sink f12 PC I uI I uI I uI L uL D D eT3 30.0.0 I
+35 d 0.35 do 6caller f1 PsT1 16arithmetic_types I
diff --git a/usr.bin/xlint/lint1/expr_range.c b/usr.bin/xlint/lint1/expr_range.c
index c2a204beb783..1cf0101ad247 100644
--- a/usr.bin/xlint/lint1/expr_range.c
+++ b/usr.bin/xlint/lint1/expr_range.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_range.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: expr_range.c,v 1.6 2024/11/13 04:32:49 rillig Exp $ */
# 3 "expr_range.c"
/*
@@ -28,7 +28,7 @@ example(unsigned x)
println("0 is reachable");
break;
case 1:
- /* expect-1: warning: statement not reached [193] */
+ /* expect-1: warning: 'case' statement not reached [193] */
println("1 is not reachable");
break;
case 2:
@@ -38,7 +38,7 @@ example(unsigned x)
println("6 is reachable");
break;
case 7:
- /* expect-1: warning: statement not reached [193] */
+ /* expect-1: warning: 'case' statement not reached [193] */
println("7 is not reachable");
break;
}
diff --git a/usr.bin/xlint/lint1/expr_sizeof.c b/usr.bin/xlint/lint1/expr_sizeof.c
index dd5e805cc499..a019d981cfea 100644
--- a/usr.bin/xlint/lint1/expr_sizeof.c
+++ b/usr.bin/xlint/lint1/expr_sizeof.c
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_sizeof.c,v 1.14 2023/08/05 10:13:39 rillig Exp $ */
+/* $NetBSD: expr_sizeof.c,v 1.20 2026/02/03 20:41:38 rillig Exp $ */
# 3 "expr_sizeof.c"
/*
@@ -175,7 +175,7 @@ sizeof_errors(void)
* A 'void array' gets replaced with an 'int array' before
* type_size_in_bits gets to see it, thus the 256 * 4 = 1024.
*/
- /* expect+2: error: illegal use of 'void' [18] */
+ /* expect+2: error: invalid use of 'void' [18] */
/* expect+1: error: negative array dimension (-1024) [20] */
typedef int sizeof_void_array[-(int)sizeof(void[256])];
@@ -199,3 +199,61 @@ struct s24 {
};
/* expect+1: error: negative array dimension (-24) [20] */
typedef int sizeof_s24[-(int)sizeof(struct s24)];
+
+void
+sizeof_array_parameter(short arr[12345])
+{
+ // The size of an array parameter is the size of the decayed pointer.
+ // Subtracting 'sizeof(void *)' makes the test platform-independent.
+ typedef int sizeof_arr[-(int)(sizeof arr - sizeof(void *))];
+
+ // The 2 comes from 'sizeof(short)', as the type 'array[size] of elem'
+ // decays into the type 'pointer to elem', not 'pointer to array[size]
+ // of elem'.
+ /* expect+1: error: negative array dimension (-2) [20] */
+ typedef int sizeof_arr_elem[-(int)(sizeof *arr)];
+}
+
+
+void
+sequence_of_structs(void)
+{
+ typedef unsigned char uint8_t;
+ typedef unsigned short uint16_t;
+ typedef unsigned int uint32_t;
+ typedef unsigned long long uint64_t;
+
+ union fp_addr {
+ uint64_t fa_64;
+ struct {
+ uint32_t fa_off;
+ uint16_t fa_seg;
+ uint16_t fa_opcode;
+ } fa_32;
+ } __packed _Alignas(4);
+
+ struct fpacc87 {
+ uint64_t f87_mantissa;
+ uint16_t f87_exp_sign;
+ } __packed _Alignas(2);
+
+ struct fpaccfx {
+ struct fpacc87 r _Alignas(16);
+ };
+
+ struct save87 {
+ uint16_t s87_cw _Alignas(4);
+ uint16_t s87_sw _Alignas(4);
+ uint16_t s87_tw _Alignas(4);
+ union fp_addr s87_ip;
+ union fp_addr s87_dp;
+ struct fpacc87 s87_ac[8];
+ };
+
+ /* expect+1: error: negative array dimension (-20) [20] */
+ typedef int o1[-(int)((unsigned long)(&(((struct save87 *)0)->s87_dp)))];
+ /* expect+1: error: negative array dimension (-28) [20] */
+ typedef int o2[-(int)((unsigned long)(&(((struct save87 *)0)->s87_ac)))];
+ /* expect+1: error: negative array dimension (-108) [20] */
+ typedef int reveal[-(int)sizeof(struct save87)];
+}
diff --git a/usr.bin/xlint/lint1/gcc_attribute_aligned.c b/usr.bin/xlint/lint1/gcc_attribute_aligned.c
index e38842020da9..c8af2e7da103 100644
--- a/usr.bin/xlint/lint1/gcc_attribute_aligned.c
+++ b/usr.bin/xlint/lint1/gcc_attribute_aligned.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_attribute_aligned.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: gcc_attribute_aligned.c,v 1.8 2024/05/01 10:30:56 rillig Exp $ */
# 3 "gcc_attribute_aligned.c"
/*
@@ -47,8 +47,8 @@ struct save87 {
struct fpacc87 s87_ac[8];
};
-/* FIXME: @4 2 + @4 2 + @4 2 + @4 8 + @4 8 + @2 (8 * 10) == 108 */
-/* expect+1: error: negative array dimension (-104) [20] */
+/* @4 2 + @4 2 + @4 2 + @4 8 + @4 8 + @2 (8 * 10) == 108 */
+/* expect+1: error: negative array dimension (-108) [20] */
typedef int sizeof_save87[-(int)sizeof(struct save87)];
@@ -69,7 +69,16 @@ aligned_struct_member(void)
*
* https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
*/
- /* TODO: should be -32 instead of -8. */
- /* expect+1: error: negative array dimension (-8) [20] */
+ /* expect+1: error: negative array dimension (-32) [20] */
typedef int ctassert[-(int)sizeof(struct aligned)];
}
+
+void
+alignment_larger_than_size(void)
+{
+ struct s {
+ unsigned u32 __attribute__((__aligned__(32)));
+ } _Alignas(4096);
+ /* expect+1: error: negative array dimension (-4096) [20] */
+ typedef int size[-(int)sizeof(struct s)];
+}
diff --git a/usr.bin/xlint/lint1/gcc_attribute_enum.c b/usr.bin/xlint/lint1/gcc_attribute_enum.c
index 66d43dd075dd..16727adb8a45 100644
--- a/usr.bin/xlint/lint1/gcc_attribute_enum.c
+++ b/usr.bin/xlint/lint1/gcc_attribute_enum.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_attribute_enum.c,v 1.5 2022/06/17 18:54:53 rillig Exp $ */
+/* $NetBSD: gcc_attribute_enum.c,v 1.6 2025/05/16 16:49:43 rillig Exp $ */
# 3 "gcc_attribute_enum.c"
/*
@@ -13,15 +13,15 @@
* See GCC, c-parser.c, function c_parser_enum_specifier.
*/
-enum __attribute__(()) tag;
+enum __attribute__(()) __attribute__((__deprecated__)) tag;
-enum __attribute__(()) tag_with_declaration {
+enum __attribute__(()) __attribute__((__deprecated__)) tag_with_declaration {
TAG_WITH_DECL
-} __attribute__(());
+} __attribute__(()) __attribute__((__deprecated__));
-enum __attribute__(()) {
+enum __attribute__(()) __attribute__((__deprecated__)) {
ONLY_DECL
-} __attribute__(());
+} __attribute__(()) __attribute__((__deprecated__));
/*
* Attributes in enumerator.
@@ -30,15 +30,15 @@ enum __attribute__(()) {
*/
enum without_initializer {
- NO_INIT_FIRST __attribute__(()),
- NO_INIT_LAST __attribute__(())
+ NO_INIT_FIRST __attribute__(()) __attribute__((__deprecated__)),
+ NO_INIT_LAST __attribute__(()) __attribute__((__deprecated__))
};
enum with_initializer {
- INIT_FIRST __attribute__(()) = 1,
- INIT_LAST __attribute__(()) = 2,
+ INIT_FIRST __attribute__(()) __attribute__((__deprecated__)) = 1,
+ INIT_LAST __attribute__(()) __attribute__((__deprecated__)) = 2,
/* expect+1: error: syntax error '__attribute__' [249] */
- INIT_WRONG = 3 __attribute__(()),
+ INIT_WRONG = 3 __attribute__(()) __attribute__((__deprecated__)),
};
enum tag {
diff --git a/usr.bin/xlint/lint1/gcc_attribute_func.c b/usr.bin/xlint/lint1/gcc_attribute_func.c
index 97c1485482a5..0cf6c0b06816 100644
--- a/usr.bin/xlint/lint1/gcc_attribute_func.c
+++ b/usr.bin/xlint/lint1/gcc_attribute_func.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_attribute_func.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: gcc_attribute_func.c,v 1.6 2025/05/16 16:49:43 rillig Exp $ */
# 3 "gcc_attribute_func.c"
/*
@@ -23,11 +23,6 @@ void *__attribute__((__cold__)) attribute_before_name(void);
void *attribute_after_name __attribute__((__cold__))(void);
void *attribute_after_parameters(void) __attribute__((__cold__));
-/*
- * The attribute 'used' does not influence static functions, it only
- * applies to function parameters.
- */
-/* expect+2: warning: static function 'used_function' unused [236] */
static void __attribute__((used))
used_function(void)
{
@@ -38,3 +33,15 @@ static void
unused_function(void)
{
}
+
+void
+/* expect+1: warning: parameter 'arr' unused in function 'param_attrs' [231] */
+param_attrs(int arr[3] __attribute__(()) __attribute__((__deprecated__)))
+{
+}
+
+void asm_function(void)
+ __asm__("asm_function_name")
+ __attribute__(()) __attribute__((__deprecated__));
+void renamed_function(void)
+ __symbolrename(renamed_function);
diff --git a/usr.bin/xlint/lint1/gcc_attribute_label.c b/usr.bin/xlint/lint1/gcc_attribute_label.c
index 430c91481df4..81b4f2a98da9 100644
--- a/usr.bin/xlint/lint1/gcc_attribute_label.c
+++ b/usr.bin/xlint/lint1/gcc_attribute_label.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_attribute_label.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: gcc_attribute_label.c,v 1.5 2025/05/16 16:49:43 rillig Exp $ */
# 3 "gcc_attribute_label.c"
/*
@@ -17,11 +17,11 @@ test(int i)
if (i < 1000)
goto hot;
error:
- __attribute__((__cold__));
+ __attribute__((__cold__)) __attribute__((__cold__));
dead();
hot:
- __attribute__((__hot__));
+ __attribute__((__hot__)) __attribute__((__hot__));
if (i < 0)
goto error;
}
diff --git a/usr.bin/xlint/lint1/gcc_attribute_var.c b/usr.bin/xlint/lint1/gcc_attribute_var.c
index 6360028fab37..0f5e9b6a8e94 100644
--- a/usr.bin/xlint/lint1/gcc_attribute_var.c
+++ b/usr.bin/xlint/lint1/gcc_attribute_var.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_attribute_var.c,v 1.11 2023/07/15 21:47:35 rillig Exp $ */
+/* $NetBSD: gcc_attribute_var.c,v 1.13 2024/09/28 15:51:40 rillig Exp $ */
# 3 "gcc_attribute_var.c"
/*
@@ -28,37 +28,18 @@ placement(
void println(void);
/*
- * Since cgram.y 1.294 from 2021-07-10, lint did not accept declarations that
- * started with __attribute__, due to a newly and accidentally introduced
- * shift/reduce conflict in the grammar.
- *
* A GCC extension allows statement of the form __attribute__((fallthrough)),
- * thus starting with __attribute__. This is the 'shift' in the conflict.
- * The 'reduce' in the conflict was begin_type.
- *
- * Before cgram 1.294, the gcc_attribute was placed outside the pair of
- * begin_type/end_type, exactly to resolve this conflict.
- *
- * Conceptually, it made sense to put the __attribute__((unused)) between
- * begin_type and end_type, to make it part of the declaration-specifiers.
- * This change introduced the hidden conflict though.
- *
- * Interestingly, the number of shift/reduce conflicts did not change in
- * cgram 1.294, the conflicts were just resolved differently than before.
- *
- * To prevent this from happening again, make sure that declarations as well
- * as statements can start with gcc_attribute.
+ * therefore, to avoid shift/reduce conflicts in the grammar, the attributes
+ * cannot be part of the declaration specifiers between begin_type/end_type.
*/
void
ambiguity_for_attribute(void)
{
- /* expect+1: warning: 'var1' unused in function 'ambiguity_for_attribute' [192] */
__attribute__((unused)) _Bool var1;
switch (1) {
case 1:
println();
- /* expect+1: warning: 'var2' unused in function 'ambiguity_for_attribute' [192] */
__attribute__((unused)) _Bool var2;
__attribute__((fallthrough));
case 2:
@@ -83,3 +64,20 @@ struct attribute_in_member_declaration {
bit2:2 __attribute__(()),
bit3:3 __attribute__(());
};
+
+
+void
+anonymous_members(void)
+{
+ struct single_attribute_outer {
+ struct single_attribute_inner {
+ int member;
+ } __attribute__(());
+ } __attribute__(());
+
+ struct multiple_attributes_outer {
+ struct multiple_attributes_inner {
+ int member;
+ } __attribute__(()) __attribute__(());
+ } __attribute__(()) __attribute__(());
+}
diff --git a/usr.bin/xlint/lint1/gcc_bit_field_types.c b/usr.bin/xlint/lint1/gcc_bit_field_types.c
index f43a65c3153b..e595815c4fcb 100644
--- a/usr.bin/xlint/lint1/gcc_bit_field_types.c
+++ b/usr.bin/xlint/lint1/gcc_bit_field_types.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_bit_field_types.c,v 1.9 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: gcc_bit_field_types.c,v 1.10 2025/04/12 15:49:49 rillig Exp $ */
# 3 "gcc_bit_field_types.c"
/* lint1-extra-flags: -X 351 */
@@ -24,7 +24,7 @@ struct example {
unsigned long unsigned_long_flag: 1;
long long long_long_flag: 1;
unsigned long long unsigned_long_long_flag: 1;
- /* expect+1: warning: illegal bit-field type 'double' [35] */
+ /* expect+1: warning: invalid bit-field type 'double' [35] */
double double_flag: 1;
};
diff --git a/usr.bin/xlint/lint1/gcc_builtin_alloca.c b/usr.bin/xlint/lint1/gcc_builtin_alloca.c
index 1fab99bf2f9f..b20d633b5d07 100644
--- a/usr.bin/xlint/lint1/gcc_builtin_alloca.c
+++ b/usr.bin/xlint/lint1/gcc_builtin_alloca.c
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_builtin_alloca.c,v 1.4 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: gcc_builtin_alloca.c,v 1.6 2025/04/12 15:49:49 rillig Exp $ */
# 3 "gcc_builtin_alloca.c"
/*
@@ -19,7 +19,7 @@ example(void)
char *aligned_ptr = __builtin_alloca_with_align(8, 64);
aligned_ptr[0] = '\0';
- /* expect+1: warning: illegal combination of pointer 'pointer to char' and integer 'int' [183] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to char' and integer 'int' for 'init' [183] */
char *unknown = __builtin_allocate(8);
unknown[0] = '\0';
}
diff --git a/usr.bin/xlint/lint1/gcc_typeof_after_statement.c b/usr.bin/xlint/lint1/gcc_typeof_after_statement.c
deleted file mode 100644
index 91698f195eb6..000000000000
--- a/usr.bin/xlint/lint1/gcc_typeof_after_statement.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* $NetBSD: gcc_typeof_after_statement.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
-# 3 "gcc_typeof_after_statement.c"
-
-/*
- * Before cgram.y 1.226 from 2021-05-03, lint could not parse typeof(...) if
- * there was a statement before it.
- */
-
-/* lint1-extra-flags: -X 351 */
-
-void *
-example(void **ptr)
-{
- return ({
- if (*ptr != (void *)0)
- ptr++;
- __typeof__(*ptr) ret = *ptr;
- ret;
- });
-}
diff --git a/usr.bin/xlint/lint1/init.c b/usr.bin/xlint/lint1/init.c
index 525f5ee2b963..7a307816f097 100644
--- a/usr.bin/xlint/lint1/init.c
+++ b/usr.bin/xlint/lint1/init.c
@@ -1,4 +1,4 @@
-/* $NetBSD: init.c,v 1.15 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: init.c,v 1.18 2025/04/12 15:49:49 rillig Exp $ */
# 3 "init.c"
/*
@@ -106,7 +106,7 @@ extern int extern_var = 1;
int defined_var = 1;
/* expect+1: warning: static variable 'static_var' unused [226] */
static int static_var = 1;
-/* expect+1: error: illegal storage class [8] */
+/* expect+1: error: invalid storage class [8] */
register int register_var = 1;
/* expect+1: error: cannot initialize typedef 'typedef_var' [25] */
typedef int typedef_var = 1;
@@ -123,3 +123,80 @@ struct {
} points_of_unknown_size[] = {
3, 4,
};
+
+void
+init_string_via_assignment(void)
+{
+ const char *cs_match = "";
+ const int *ws_match = L"";
+
+ /* expect+1: warning: invalid combination of 'pointer to const char' and 'pointer to int', op 'init' [124] */
+ const char *cs_mismatch = L"";
+ /* expect+1: warning: invalid combination of 'pointer to const int' and 'pointer to char', op 'init' [124] */
+ const int *ws_mismatch = "";
+}
+
+void
+init_pointer_in_struct(void)
+{
+ struct cs_ws {
+ const char *cs;
+ const int *ws;
+ };
+
+ struct cs_ws type_match = {
+ "",
+ L"",
+ };
+
+ struct cs_ws type_mismatch = {
+ /* expect+1: warning: invalid combination of 'pointer to const char' and 'pointer to int', op 'init' [124] */
+ L"",
+ /* expect+1: warning: invalid combination of 'pointer to const int' and 'pointer to char', op 'init' [124] */
+ "",
+ };
+
+ struct cs_ws extra_braces = {
+ { "" },
+ { L"" },
+ };
+}
+
+
+void
+init_array_in_struct(void)
+{
+ struct cs_ws {
+ const char cs[10];
+ const int ws[10];
+ };
+
+ struct cs_ws type_match = {
+ "",
+ L"",
+ };
+
+ struct cs_ws type_mismatch = {
+ /* expect+1: warning: invalid combination of integer 'char' and pointer 'pointer to int' for 'init' [183] */
+ L"",
+ /* expect+1: warning: invalid combination of integer 'char' and pointer 'pointer to char' for 'init' [183] */
+ "",
+ };
+
+ struct cs_ws no_terminating_null = {
+ "0123456789",
+ L"0123456789",
+ };
+
+ struct cs_ws too_many_characters = {
+ /* expect+1: warning: string literal too long (11) for target array (10) [187] */
+ "0123456789X",
+ /* expect+1: warning: string literal too long (11) for target array (10) [187] */
+ L"0123456789X",
+ };
+
+ struct cs_ws extra_braces = {
+ { "" },
+ { L"" },
+ };
+}
diff --git a/usr.bin/xlint/lint1/init_braces.c b/usr.bin/xlint/lint1/init_braces.c
index 7eab2f1d70e9..2fcbe5d58d07 100644
--- a/usr.bin/xlint/lint1/init_braces.c
+++ b/usr.bin/xlint/lint1/init_braces.c
@@ -1,4 +1,4 @@
-/* $NetBSD: init_braces.c,v 1.9 2023/07/21 06:02:07 rillig Exp $ */
+/* $NetBSD: init_braces.c,v 1.11 2025/04/12 15:49:49 rillig Exp $ */
# 3 "init_braces.c"
/*
@@ -44,14 +44,14 @@ init_string(void)
/* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
/* clang-expect+3: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
/* clang-expect+2: warning: braces around scalar initializer */
- /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
+ /* expect+1: warning: invalid combination of integer 'char' and pointer 'pointer to char' for 'init' [183] */
char name2[] = {{ "" }};
/* gcc-expect+6: warning: braces around scalar initializer */
/* gcc-expect+5: warning: braces around scalar initializer */
/* gcc-expect+4: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast */
/* clang-expect+3: warning: too many braces around scalar initializer */
/* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
- /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
+ /* expect+1: warning: invalid combination of integer 'char' and pointer 'pointer to char' for 'init' [183] */
char name3[] = {{{ "" }}};
/* gcc-expect+8: warning: braces around scalar initializer */
/* gcc-expect+7: warning: braces around scalar initializer */
@@ -60,7 +60,7 @@ init_string(void)
/* clang-expect+4: warning: too many braces around scalar initializer */
/* clang-expect+3: warning: too many braces around scalar initializer */
/* clang-expect+2: warning: incompatible pointer to integer conversion initializing 'char' with an expression of type 'char [1]' */
- /* expect+1: warning: illegal combination of integer 'char' and pointer 'pointer to char' [183] */
+ /* expect+1: warning: invalid combination of integer 'char' and pointer 'pointer to char' for 'init' [183] */
char name4[] = {{{{ "" }}}};
}
diff --git a/usr.bin/xlint/lint1/lang_level_c99.c b/usr.bin/xlint/lint1/lang_level_c99.c
index 85d0a8f52fab..442cd2bf585e 100644
--- a/usr.bin/xlint/lint1/lang_level_c99.c
+++ b/usr.bin/xlint/lint1/lang_level_c99.c
@@ -1,16 +1,21 @@
-/* $NetBSD: lang_level_c99.c,v 1.2 2023/08/06 19:44:50 rillig Exp $ */
+/* $NetBSD: lang_level_c99.c,v 1.6 2024/11/05 04:53:28 rillig Exp $ */
# 3 "lang_level_c99.c"
/*
- * Tests that are specific to the C99 language level, in particular, features
- * that were added in C99.
+ * Tests that are specific to the C99 language level, in particular:
*
- * In the below comments, [-] means unsupported and [x] means supported.
+ * * syntax elements that were added in C99
+ * * lint diagnostics that differ between the C90 and C99 language levels
+ * * lint diagnostics that differ between the C99 and C11 language levels
*/
/* lint1-flags: -S -w -X 351 */
-/* C99 Foreword */
+/*
+ * Features that were added in the C99 standard, as listed in the C99 foreword.
+ *
+ * In the below comments, [-] means unsupported and [x] means supported.
+ */
// [-] restricted character set support via digraphs and <iso646.h>
//
@@ -141,10 +146,23 @@ hexadecimal_floating_point_constants(void)
// [x] compound literals
//
// See d_c99_compound_literal_comma.c.
+struct short_rect {
+ short top, left, bottom, right;
+};
+
+struct short_rect *rect_location(void);
+
+void
+compound_literal(void)
+{
+ struct short_rect me = (struct short_rect){ 1, 2, 3, 4 };
+ me.left = me.left;
+ *rect_location() = (struct short_rect){ 1, 2, 3, 4 };
+}
// [x] designated initializers
//
-// See d_c99_init.c.
+// See init_c99.c.
// [x] // comments
//
@@ -171,6 +189,18 @@ call_implicitly_declared_function(void)
// [x] mixed declarations and code
// [x] new block scopes for selection and iteration statements
+void
+for_scope(void)
+{
+ // A for loop may have a declaration in its first part.
+ for (int i = 0; i < 10; i++)
+ continue;
+
+ // Test that the scope of the previous i has ended.
+ for (int i = 0; i < 10; i++)
+ continue;
+}
+
// [?] integer constant type rules
//
@@ -262,6 +292,21 @@ const const int duplicate_type_qualifier = 2;
// [x] __func__ predefined identifier
//
// Yes, see 'fallback_symbol'.
+const char *
+function_name(void)
+{
+ /* expect+1: error: negative array dimension (-14) [20] */
+ typedef int reveal_size[-(int)sizeof(__func__)];
+ return __func__;
+}
+
+
+// Since tree.c 1.504 from 2023-01-29 and before tree.c 1.591 from 2024-01-07,
+// lint crashed because there was no "current function", even though the
+// "block level" was not 0.
+/* expect+1: error: '__func__' undefined [99] */
+typedef int func_outside_function(int[sizeof(__func__)]);
+
// [x] va_copy macro
//
diff --git a/usr.bin/xlint/lint1/lex_char.c b/usr.bin/xlint/lint1/lex_char.c
index c7f1035042c5..78457d07e5bd 100644
--- a/usr.bin/xlint/lint1/lex_char.c
+++ b/usr.bin/xlint/lint1/lex_char.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lex_char.c,v 1.7 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: lex_char.c,v 1.9 2024/02/02 19:07:58 rillig Exp $ */
# 3 "lex_char.c"
/*
@@ -27,9 +27,11 @@ test(void)
sink('ä');
/* GCC extension */
- /* expect+1: warning: dubious escape \e [79] */
sink('\e');
+ /* expect+1: warning: dubious escape \y [79] */
+ sink('\y');
+
/* since C99 */
sink('\x12');
@@ -59,6 +61,18 @@ test(void)
/* U+000D carriage return */
sink('\r');
+
+ /* A double quote may be escaped or not, since C90. */
+ sink('"');
+ sink('\"');
+
+ /* A question mark may be escaped or not, since C90. */
+ sink('?');
+ sink('\?');
+
+ sink('\\');
+
+ sink('\'');
}
/*
diff --git a/usr.bin/xlint/lint1/lex_comment.c b/usr.bin/xlint/lint1/lex_comment.c
index 850342468fdb..3c3edec97829 100644
--- a/usr.bin/xlint/lint1/lex_comment.c
+++ b/usr.bin/xlint/lint1/lex_comment.c
@@ -1,13 +1,89 @@
-/* $NetBSD: lex_comment.c,v 1.1 2021/06/19 20:25:58 rillig Exp $ */
+/* $NetBSD: lex_comment.c,v 1.3 2024/10/04 11:38:03 rillig Exp $ */
# 3 "lex_comment.c"
/*
+ * Tests for comments, including lint-style comments that
+ * suppress a single diagnostic.
+ */
+
+/* lint1-extra-flags: -X 351 -aa */
+
+signed char s8;
+signed long long s64;
+
+// A "LINTED" comment suppresses a single warning until the end of the next
+// statement.
+void
+lint_comment(void)
+{
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = s64;
+
+ /* LINTED 132 */
+ s8 = s64;
+
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = s64;
+
+ /* LINTED 132 "comment" */
+ s8 = s64;
+
+ /* LINTED 132 */
+ {
+ }
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = s64;
+
+ /* LINTED 132 */
+ {
+ s8 = s64;
+ }
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = s64;
+
+ if (s8 == 0)
+ ;
+ /* LINTED 132 */
+ s8 = s64;
+
+ if (s8 == 0) {
+ }
+ /* LINTED 132 */
+ s8 = s64;
+
+ if (s8 == 0)
+ ;
+ else
+ ;
+ /* LINTED 132 */
+ s8 = s64;
+
+ if (s8 == 0) {
+ } else {
+ }
+ /* LINTED 132 */
+ s8 = s64;
+
+ if (s8 == 0) {
+ } else if (s8 == 1)
+ ;
+ /* LINTED 132 */
+ s8 = s64;
+
+ if (s8 == 0) {
+ } else if (s8 == 1) {
+ }
+ /* LINTED 132 */
+ s8 = s64;
+}
+
+
+/*
* Before lex.c 1.41 from 2021-06-19, lint ran into an endless loop when it
* saw an unclosed comment at the end of the translation unit. In practice
* this was not relevant since the translation unit always comes from the C
* preprocessor, which always emits a well-formed token sequence.
*/
-/* expect+3: error: unterminated comment [256] */
-/* expect+2: warning: empty translation unit [272] */
+/* expect+2: error: unterminated comment [256] */
/* unclosed comment
diff --git a/usr.bin/xlint/lint1/lex_integer_ilp32.c b/usr.bin/xlint/lint1/lex_integer_ilp32.c
index f82025bc1632..58b02213a305 100644
--- a/usr.bin/xlint/lint1/lex_integer_ilp32.c
+++ b/usr.bin/xlint/lint1/lex_integer_ilp32.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lex_integer_ilp32.c,v 1.8 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: lex_integer_ilp32.c,v 1.9 2024/01/28 06:57:41 rillig Exp $ */
# 3 "lex_integer_ilp32.c"
/*
@@ -23,12 +23,11 @@ test_signed_int(void)
sinki(2147483647);
- /* expect+1: warning: conversion of 'unsigned long' to 'int' is out of range, arg #1 [295] */
+ /* expect+1: warning: conversion of 'long long' to 'int' is out of range, arg #1 [295] */
sinki(2147483648);
sinki(-2147483647);
- /* expect+1: warning: conversion of 'unsigned long' to 'int' is out of range, arg #1 [295] */
sinki(-2147483648);
}
@@ -43,6 +42,6 @@ test_unsigned_int(void)
sinku(2147483648U);
sinku(4294967295U);
- /* expect+1: warning: integer constant out of range [252] */
+ /* expect+1: warning: conversion of 'unsigned long long' to 'unsigned int' is out of range, arg #1 [295] */
sinku(4294967296U);
}
diff --git a/usr.bin/xlint/lint1/lex_wide_char.c b/usr.bin/xlint/lint1/lex_wide_char.c
index 2734dd53b49a..febd0a83bc10 100644
--- a/usr.bin/xlint/lint1/lex_wide_char.c
+++ b/usr.bin/xlint/lint1/lex_wide_char.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lex_wide_char.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: lex_wide_char.c,v 1.5 2024/01/19 19:23:34 rillig Exp $ */
# 3 "lex_wide_char.c"
/*
@@ -26,9 +26,11 @@ test(void)
sink(L'ä');
/* GCC extension */
- /* expect+1: warning: dubious escape \e [79] */
sink(L'\e');
+ /* expect+1: warning: dubious escape \y [79] */
+ sink(L'\y');
+
/* since C99 */
sink(L'\x12');
diff --git a/usr.bin/xlint/lint1/lex_wide_string.c b/usr.bin/xlint/lint1/lex_wide_string.c
index 48c06d1aa6b3..314b7c467aa4 100644
--- a/usr.bin/xlint/lint1/lex_wide_string.c
+++ b/usr.bin/xlint/lint1/lex_wide_string.c
@@ -1,4 +1,4 @@
-/* $NetBSD: lex_wide_string.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: lex_wide_string.c,v 1.5 2024/02/02 22:45:48 rillig Exp $ */
# 3 "lex_wide_string.c"
/*
@@ -33,3 +33,12 @@ test(void)
/* expect+1: error: cannot concatenate wide and regular string literals [292] */
sink(L"wide" "plain");
}
+
+/*
+ * Since lint always runs in the default "C" locale, it does not support any
+ * multibyte character encoding, thus treating each byte as a separate
+ * character. If lint were to support UTF-8, the array dimension would be 3
+ * instead of 7.
+ */
+/* expect+1: error: negative array dimension (-7) [20] */
+typedef int mblen[-(int)(sizeof(L"Ä😄") / sizeof(L""))];
diff --git a/usr.bin/xlint/lint1/msg_003.c b/usr.bin/xlint/lint1/msg_003.c
index 1af431a52e42..b7daf2f24086 100644
--- a/usr.bin/xlint/lint1/msg_003.c
+++ b/usr.bin/xlint/lint1/msg_003.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_003.c,v 1.7 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: msg_003.c,v 1.9 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_003.c"
// Test for message: '%s' declared in parameter declaration list [3]
@@ -7,6 +7,7 @@
/*ARGSUSED*/
void
+/* expect+1: warning: function definition for 'example' with identifier list is obsolete in C23 [384] */
example(declare_struct, declare_union, declare_enum)
/* expect+1: warning: 'incomplete struct struct_in_parameter' declared in parameter declaration list [3] */
struct struct_in_parameter *declare_struct;
diff --git a/usr.bin/xlint/lint1/msg_004.c b/usr.bin/xlint/lint1/msg_004.c
index 1ee74752268d..75894c98c765 100644
--- a/usr.bin/xlint/lint1/msg_004.c
+++ b/usr.bin/xlint/lint1/msg_004.c
@@ -1,7 +1,10 @@
-/* $NetBSD: msg_004.c,v 1.7 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_004.c,v 1.10 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_004.c"
-// Test for message: illegal type combination [4]
+// Test for message: invalid type combination [4]
+//
+// See also:
+// msg_005.c
/* lint1-extra-flags: -X 351 */
@@ -13,15 +16,37 @@ double ok_double;
float _Complex ok_float_complex;
/* expect+2: error: invalid type for _Complex [308] */
-/* expect+1: error: illegal type combination [4] */
-int _Complex illegal_int_complex;
+/* expect+1: error: invalid type combination [4] */
+int _Complex invalid_int_complex;
char enum {
CHAR
};
-/* expect-1: error: illegal type combination [4] */
+/* expect-1: error: invalid type combination [4] */
long struct {
int member;
};
-/* expect-1: error: illegal type combination [4] */
+/* expect-1: error: invalid type combination [4] */
+
+struct str {
+};
+/* expect+1: error: invalid type combination [4] */
+struct str int struct_str_int;
+
+/* expect+1: error: invalid type combination [4] */
+unsigned signed int unsigned_signed_int;
+
+/* expect+1: error: invalid type combination [4] */
+unsigned unsigned int unsigned_unsigned_int;
+
+/* expect+1: error: invalid type combination [4] */
+long long long int long_long_long_int;
+
+/* expect+1: error: invalid type combination [4] */
+short double short_double;
+
+double short double_short;
+
+/* expect+1: error: invalid type combination [4] */
+char double short char_double_short;
diff --git a/usr.bin/xlint/lint1/msg_005.c b/usr.bin/xlint/lint1/msg_005.c
index 662b6c5e08a7..eeddf6c5e729 100644
--- a/usr.bin/xlint/lint1/msg_005.c
+++ b/usr.bin/xlint/lint1/msg_005.c
@@ -1,29 +1,146 @@
-/* $NetBSD: msg_005.c,v 1.5 2022/06/17 18:54:53 rillig Exp $ */
+/* $NetBSD: msg_005.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_005.c"
// Test for message: modifying typedef with '%s'; only qualifiers allowed [5]
-typedef int number;
+typedef char char_alias;
+typedef signed char schar_alias;
+typedef unsigned char uchar_alias;
+typedef short short_alias;
+typedef unsigned short ushort_alias;
+typedef int int_alias;
+typedef unsigned int uint_alias;
+typedef long long_alias;
+typedef unsigned long ulong_alias;
+typedef long long llong_alias;
+typedef unsigned long long ullong_alias;
+typedef float float_alias;
+typedef double double_alias;
+typedef long double ldouble_alias;
+typedef float _Complex fcomplex_alias;
+typedef double _Complex dcomplex_alias;
+typedef long double _Complex lcomplex_alias;
/* expect+1: warning: modifying typedef with 'signed'; only qualifiers allowed [5] */
-typedef number signed signed_number;
-
+typedef char_alias signed err_s_char;
+/* expect+1: warning: modifying typedef with 'unsigned'; only qualifiers allowed [5] */
+typedef char_alias unsigned err_u_char;
+/* expect+1: error: invalid type combination [4] */
+typedef schar_alias signed err_s_schar;
+/* expect+1: error: invalid type combination [4] */
+typedef schar_alias unsigned err_u_schar;
+/* expect+1: error: invalid type combination [4] */
+typedef uchar_alias signed err_s_uchar;
+/* expect+1: error: invalid type combination [4] */
+typedef uchar_alias unsigned err_u_uchar;
+/* expect+1: warning: modifying typedef with 'signed'; only qualifiers allowed [5] */
+typedef short_alias signed err_s_short;
+/* expect+1: warning: modifying typedef with 'unsigned'; only qualifiers allowed [5] */
+typedef short_alias unsigned err_u_short;
+/* expect+1: error: invalid type combination [4] */
+typedef ushort_alias signed err_s_ushort;
+/* expect+1: error: invalid type combination [4] */
+typedef ushort_alias unsigned err_u_ushort;
+/* expect+1: warning: modifying typedef with 'signed'; only qualifiers allowed [5] */
+typedef int_alias signed err_s_int;
+/* expect+1: warning: modifying typedef with 'unsigned'; only qualifiers allowed [5] */
+typedef int_alias unsigned err_u_int;
+/* expect+1: error: invalid type combination [4] */
+typedef uint_alias signed err_s_uint;
+/* expect+1: error: invalid type combination [4] */
+typedef uint_alias unsigned err_u_uint;
+/* expect+1: warning: modifying typedef with 'signed'; only qualifiers allowed [5] */
+typedef long_alias signed err_s_long;
+/* expect+1: warning: modifying typedef with 'unsigned'; only qualifiers allowed [5] */
+typedef long_alias unsigned err_u_long;
+/* expect+1: error: invalid type combination [4] */
+typedef ulong_alias signed err_s_ulong;
+/* expect+1: error: invalid type combination [4] */
+typedef ulong_alias unsigned err_u_ulong;
+/* expect+1: warning: modifying typedef with 'signed'; only qualifiers allowed [5] */
+typedef llong_alias signed err_s_llong;
/* expect+1: warning: modifying typedef with 'unsigned'; only qualifiers allowed [5] */
-typedef number unsigned unsigned_number;
+typedef llong_alias unsigned err_u_llong;
+/* expect+1: error: invalid type combination [4] */
+typedef ullong_alias signed err_s_ullong;
+/* expect+1: error: invalid type combination [4] */
+typedef ullong_alias unsigned err_u_ullong;
+/* expect+1: error: invalid type combination [4] */
+typedef float_alias signed err_s_float;
+/* expect+1: error: invalid type combination [4] */
+typedef float_alias unsigned err_u_float;
+/* expect+1: error: invalid type combination [4] */
+typedef double_alias signed err_s_double;
+/* expect+1: error: invalid type combination [4] */
+typedef double_alias unsigned err_u_double;
+/* expect+1: error: invalid type combination [4] */
+typedef ldouble_alias signed err_s_ldouble;
+/* expect+1: error: invalid type combination [4] */
+typedef ldouble_alias unsigned err_u_ldouble;
+/* expect+1: error: invalid type combination [4] */
+typedef fcomplex_alias signed err_s_fcomplex;
+/* expect+1: error: invalid type combination [4] */
+typedef fcomplex_alias unsigned err_u_fcomplex;
+/* expect+1: error: invalid type combination [4] */
+typedef dcomplex_alias signed err_s_dcomplex;
+/* expect+1: error: invalid type combination [4] */
+typedef dcomplex_alias unsigned err_u_dcomplex;
+/* expect+1: error: invalid type combination [4] */
+typedef lcomplex_alias signed err_s_lcomplex;
+/* expect+1: error: invalid type combination [4] */
+typedef lcomplex_alias unsigned err_u_lcomplex;
/* expect+1: warning: modifying typedef with 'short'; only qualifiers allowed [5] */
-typedef number short short_number;
+typedef int_alias short err_short_int;
+/* expect+1: error: invalid type combination [4] */
+typedef long_alias short err_short_long;
+/* expect+1: error: invalid type combination [4] */
+typedef float_alias short err_short_float;
+/* expect+1: error: invalid type combination [4] */
+typedef char_alias long err_l_char;
+/* expect+1: error: invalid type combination [4] */
+typedef schar_alias long err_l_schar;
+/* expect+1: error: invalid type combination [4] */
+typedef uchar_alias long err_l_uchar;
+/* expect+1: error: invalid type combination [4] */
+typedef short_alias long err_l_short;
+/* expect+1: error: invalid type combination [4] */
+typedef ushort_alias long err_l_ushort;
+/* expect+1: warning: modifying typedef with 'long'; only qualifiers allowed [5] */
+typedef int_alias long err_l_int;
+/* expect+1: warning: modifying typedef with 'long'; only qualifiers allowed [5] */
+typedef uint_alias long err_l_uint;
+/* expect+1: warning: modifying typedef with 'long'; only qualifiers allowed [5] */
+typedef long_alias long err_l_long;
/* expect+1: warning: modifying typedef with 'long'; only qualifiers allowed [5] */
-typedef number long long_number;
+typedef ulong_alias long err_l_ulong;
+/* expect+1: error: invalid type combination [4] */
+typedef llong_alias long err_l_llong;
+/* expect+1: error: invalid type combination [4] */
+typedef ullong_alias long err_l_ullong;
+/* expect+1: warning: modifying typedef with 'long'; only qualifiers allowed [5] */
+typedef float_alias long err_l_float;
+/* expect+1: warning: modifying typedef with 'long'; only qualifiers allowed [5] */
+typedef double_alias long err_l_double;
+/* expect+1: error: invalid type combination [4] */
+typedef ldouble_alias long err_l_ldouble;
+/* expect+1: error: invalid type combination [4] */
+typedef fcomplex_alias long err_l_fcomplex;
+/* expect+1: warning: modifying typedef with 'long'; only qualifiers allowed [5] */
+typedef dcomplex_alias long err_l_dcomplex;
+/* expect+1: error: invalid type combination [4] */
+typedef lcomplex_alias long err_l_lcomplex;
+
/*
- * If the type qualifier comes first, the following name is interpreted as a
- * new name, not as the one referring to the typedef. This makes the above
- * type modifications even more obscure.
+ * If the type qualifier comes before the type name, which would be the
+ * natural order, the type name is interpreted as a new name, not as the one
+ * referring to the typedef. This makes the above type modifications even
+ * more unlikely to be accidentally seen in practice.
*/
/* expect+1: error: syntax error 'prefix_long_number' [249] */
-typedef long number prefix_long_number;
+typedef long int_alias prefix_long_number;
/* Type qualifiers are OK. */
-typedef number const const_number;
+typedef int_alias const const_int;
diff --git a/usr.bin/xlint/lint1/msg_006.c b/usr.bin/xlint/lint1/msg_006.c
index c25a062449a0..ec9ffca298cd 100644
--- a/usr.bin/xlint/lint1/msg_006.c
+++ b/usr.bin/xlint/lint1/msg_006.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_006.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_006.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_006.c"
// Test for message: use 'double' instead of 'long float' [6]
@@ -6,6 +6,6 @@
/* lint1-extra-flags: -X 351 */
/* expect+2: warning: use 'double' instead of 'long float' [6] */
-/* expect+1: error: illegal type combination [4] */
+/* expect+1: error: invalid type combination [4] */
long float x;
double x;
diff --git a/usr.bin/xlint/lint1/msg_008.c b/usr.bin/xlint/lint1/msg_008.c
index e83884d3eeaf..1b351d44ab62 100644
--- a/usr.bin/xlint/lint1/msg_008.c
+++ b/usr.bin/xlint/lint1/msg_008.c
@@ -1,10 +1,10 @@
-/* $NetBSD: msg_008.c,v 1.4 2022/06/15 20:18:31 rillig Exp $ */
+/* $NetBSD: msg_008.c,v 1.5 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_008.c"
-// Test for message: illegal storage class [8]
+// Test for message: invalid storage class [8]
typedef void
example(void)
-/* expect+1: error: illegal storage class [8] */
+/* expect+1: error: invalid storage class [8] */
{
}
diff --git a/usr.bin/xlint/lint1/msg_011.c b/usr.bin/xlint/lint1/msg_011.c
index de4b33ea7e06..ee1fd805ac0f 100644
--- a/usr.bin/xlint/lint1/msg_011.c
+++ b/usr.bin/xlint/lint1/msg_011.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_011.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_011.c,v 1.8 2024/06/08 06:37:06 rillig Exp $ */
# 3 "msg_011.c"
// Test for message: bit-field initializer out of range [11]
@@ -14,17 +14,17 @@ example(void)
/* expect+1: warning: 's' set but not used in function 'example' [191] */
} s[] = {
/* expect+2: warning: bit-field initializer out of range [11] */
- /* expect+1: warning: initialization of unsigned with negative constant [221] */
+ /* expect+1: warning: initialization of unsigned type 'unsigned int:3' with negative constant -8 [221] */
{ -8, -8 },
/* expect+2: warning: bit-field initializer out of range [11] */
- /* expect+1: warning: initialization of unsigned with negative constant [221] */
+ /* expect+1: warning: initialization of unsigned type 'unsigned int:3' with negative constant -7 [221] */
{ -7, -7 },
- /* expect+1: warning: initialization of unsigned with negative constant [221] */
+ /* expect+1: warning: initialization of unsigned type 'unsigned int:3' with negative constant -4 [221] */
{ -4, -4 },
- /* expect+1: warning: initialization of unsigned with negative constant [221] */
+ /* expect+1: warning: initialization of unsigned type 'unsigned int:3' with negative constant -3 [221] */
{ -3, -3 },
{ 3, 3 },
diff --git a/usr.bin/xlint/lint1/msg_014.c b/usr.bin/xlint/lint1/msg_014.c
index 09032ef03f91..8367de2c1fd3 100644
--- a/usr.bin/xlint/lint1/msg_014.c
+++ b/usr.bin/xlint/lint1/msg_014.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_014.c,v 1.8 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_014.c,v 1.9 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_014.c"
// Test for message: compiler takes alignment of function [14]
@@ -11,14 +11,14 @@ typedef void function(void);
/* expect+1: error: cannot take size/alignment of function type 'function(void) returning void' [144] */
unsigned long alignof_function = __alignof__(function);
-struct illegal_bit_field {
- /* expect+1: warning: illegal bit-field type 'function(void) returning void' [35] */
+struct invalid_bit_field {
+ /* expect+1: warning: invalid bit-field type 'function(void) returning void' [35] */
function bit_field:1;
- /* expect+1: error: function illegal in structure or union [38] */
+ /* expect+1: error: function invalid in structure or union [38] */
function member;
};
struct s {
- /* expect+1: error: array of function is illegal [16] */
+ /* expect+1: error: array of function is invalid [16] */
function member[5];
};
diff --git a/usr.bin/xlint/lint1/msg_015.c b/usr.bin/xlint/lint1/msg_015.c
index 19df92a32bae..e1f57e499510 100644
--- a/usr.bin/xlint/lint1/msg_015.c
+++ b/usr.bin/xlint/lint1/msg_015.c
@@ -1,11 +1,11 @@
-/* $NetBSD: msg_015.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_015.c,v 1.6 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_015.c"
-// Test for message: function returns illegal type '%s' [15]
+// Test for message: function returns invalid type '%s' [15]
/* lint1-extra-flags: -X 351 */
typedef int array[5];
-/* expect+1: error: function returns illegal type 'array[5] of int' [15] */
+/* expect+1: error: function returns invalid type 'array[5] of int' [15] */
array invalid(void);
diff --git a/usr.bin/xlint/lint1/msg_016.c b/usr.bin/xlint/lint1/msg_016.c
index 2966e0228e6b..8b198fcb9a17 100644
--- a/usr.bin/xlint/lint1/msg_016.c
+++ b/usr.bin/xlint/lint1/msg_016.c
@@ -1,18 +1,18 @@
-/* $NetBSD: msg_016.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_016.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_016.c"
-// Test for message: array of function is illegal [16]
+// Test for message: array of function is invalid [16]
/* lint1-extra-flags: -X 351 */
typedef void function(void);
-/* expect+1: error: array of function is illegal [16] */
+/* expect+1: error: array of function is invalid [16] */
function functions[] = {
/*
* XXX: The below warning should not assume that function is an
* integer type.
*/
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to void' for 'init' [183] */
(void *)0,
};
diff --git a/usr.bin/xlint/lint1/msg_018.c b/usr.bin/xlint/lint1/msg_018.c
index 30196f1bc9b0..89abb67867d5 100644
--- a/usr.bin/xlint/lint1/msg_018.c
+++ b/usr.bin/xlint/lint1/msg_018.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_018.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_018.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_018.c"
-// Test for message: illegal use of 'void' [18]
+// Test for message: invalid use of 'void' [18]
/* lint1-extra-flags: -X 351 */
@@ -11,6 +11,6 @@ void x;
/* expect+1: error: cannot take size/alignment of void [146] */
unsigned long sizeof_void = sizeof(void);
-/* expect+2: error: illegal use of 'void' [18] */
+/* expect+2: error: invalid use of 'void' [18] */
/* expect+1: warning: empty array declaration for 'void_array' [190] */
void void_array[];
diff --git a/usr.bin/xlint/lint1/msg_019.c b/usr.bin/xlint/lint1/msg_019.c
index 2e5b05a69c51..995b053b940d 100644
--- a/usr.bin/xlint/lint1/msg_019.c
+++ b/usr.bin/xlint/lint1/msg_019.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_019.c,v 1.8 2023/07/09 11:18:55 rillig Exp $ */
+/* $NetBSD: msg_019.c,v 1.9 2024/01/28 08:54:27 rillig Exp $ */
# 3 "msg_019.c"
// Test for message: void type for '%s' [19]
@@ -12,8 +12,8 @@ void global_variable;
/* expect+1: warning: static variable 'unit_variable' unused [226] */
static void unit_variable;
-/* expect+3: warning: parameter 'parameter' unused in function 'function' [231] */
-/* expect+2: error: void parameter 'parameter' cannot have name [61] */
+/* expect+3: error: void parameter 'parameter' cannot have name [61] */
+/* expect+2: warning: parameter 'parameter' unused in function 'function' [231] */
void
function(void parameter)
{
diff --git a/usr.bin/xlint/lint1/msg_021.c b/usr.bin/xlint/lint1/msg_021.c
index b03759c00d0f..2d3ab1c410ae 100644
--- a/usr.bin/xlint/lint1/msg_021.c
+++ b/usr.bin/xlint/lint1/msg_021.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_021.c,v 1.6 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: msg_021.c,v 1.8 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_021.c"
// Test for message: redeclaration of formal parameter '%s' [21]
@@ -9,7 +9,8 @@
/*ARGSUSED*/
void
-/* expect+1: error: redeclaration of formal parameter 'parameter' [21] */
+/* expect+2: error: redeclaration of formal parameter 'parameter' [21] */
+/* expect+1: warning: function definition for 'old_style_with_duplicate_parameter' with identifier list is obsolete in C23 [384] */
old_style_with_duplicate_parameter(parameter, parameter)
int parameter;
{
@@ -17,6 +18,7 @@ old_style_with_duplicate_parameter(parameter, parameter)
}
void
+/* expect+1: warning: function definition for 'old_style_with_duplicate_parameter_declaration' with identifier list is obsolete in C23 [384] */
old_style_with_duplicate_parameter_declaration(parameter)
int parameter;
/* expect+1: error: redeclaration of formal parameter 'parameter' [237] */
@@ -24,6 +26,7 @@ old_style_with_duplicate_parameter_declaration(parameter)
{
}
+/* expect+1: warning: function definition for 'old_style_with_local_variable' with identifier list is obsolete in C23 [384] */
void old_style_with_local_variable(parameter)
int parameter;
{
diff --git a/usr.bin/xlint/lint1/msg_022.c b/usr.bin/xlint/lint1/msg_022.c
index 8841e1541887..475968f0d02b 100644
--- a/usr.bin/xlint/lint1/msg_022.c
+++ b/usr.bin/xlint/lint1/msg_022.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_022.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_022.c,v 1.8 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_022.c"
// Test for message: incomplete or misplaced function definition [22]
@@ -27,6 +27,7 @@ unsigned long sz = sizeof(int(param1, param2));
/* expect+1: warning: empty declaration [0] */
;
+/* expect+3: warning: function definition for 'old_style' with identifier list is obsolete in C23 [384] */
/* expect+2: error: incomplete or misplaced function definition [22] */
/* expect+1: warning: old-style declaration; add 'int' [1] */
old_style(arg);
diff --git a/usr.bin/xlint/lint1/msg_030.c b/usr.bin/xlint/lint1/msg_030.c
index 69b05289da74..8ec2cc62988c 100644
--- a/usr.bin/xlint/lint1/msg_030.c
+++ b/usr.bin/xlint/lint1/msg_030.c
@@ -1,23 +1,23 @@
-/* $NetBSD: msg_030.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_030.c,v 1.8 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_030.c"
-/* Test for message: redeclaration of '%s'; ANSI C requires static [30] */
+/* Test for message: redeclaration of '%s'; C90 or later require static [30] */
/* lint1-flags: -sw -X 351 */
/* expect+1: error: old-style declaration; add 'int' [1] */
static a;
-/* expect+1: warning: redeclaration of 'a'; ANSI C requires static [30] */
+/* expect+1: warning: redeclaration of 'a'; C90 or later require static [30] */
int a;
/* expect+1: error: old-style declaration; add 'int' [1] */
static b;
-/* expect+1: warning: redeclaration of 'b'; ANSI C requires static [30] */
+/* expect+1: warning: redeclaration of 'b'; C90 or later require static [30] */
int b = 1;
/* expect+1: error: old-style declaration; add 'int' [1] */
static c = 1;
-/* expect+1: warning: redeclaration of 'c'; ANSI C requires static [30] */
+/* expect+1: warning: redeclaration of 'c'; C90 or later require static [30] */
int c;
void
diff --git a/usr.bin/xlint/lint1/msg_032.c b/usr.bin/xlint/lint1/msg_032.c
index 5cfc0ea26caf..4cf15263efee 100644
--- a/usr.bin/xlint/lint1/msg_032.c
+++ b/usr.bin/xlint/lint1/msg_032.c
@@ -1,12 +1,13 @@
-/* $NetBSD: msg_032.c,v 1.8 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: msg_032.c,v 1.10 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_032.c"
// Test for message: type of parameter '%s' defaults to 'int' [32]
/* lint1-extra-flags: -X 351 */
-/* expect+5: error: old-style declaration; add 'int' [1] */
+/* expect+1: warning: function definition for 'add' with identifier list is obsolete in C23 [384] */
add(a, b, c)
+/* expect+4: error: old-style declaration; add 'int' [1] */
/* expect+3: warning: type of parameter 'a' defaults to 'int' [32] */
/* expect+2: warning: type of parameter 'b' defaults to 'int' [32] */
/* expect+1: warning: type of parameter 'c' defaults to 'int' [32] */
diff --git a/usr.bin/xlint/lint1/msg_035.c b/usr.bin/xlint/lint1/msg_035.c
index 5d736347e568..b1bcbb193c1c 100644
--- a/usr.bin/xlint/lint1/msg_035.c
+++ b/usr.bin/xlint/lint1/msg_035.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_035.c,v 1.11 2022/06/15 20:18:31 rillig Exp $ */
+/* $NetBSD: msg_035.c,v 1.12 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_035.c"
-// Test for message: illegal bit-field type '%s' [35]
+// Test for message: invalid bit-field type '%s' [35]
/* Omit -g, see gcc_bit_field_types.c. */
/* lint1-flags: -Sw */
@@ -42,47 +42,47 @@ struct example {
int int_flag: 1;
unsigned int unsigned_int_flag: 1;
- /* expect+1: warning: illegal bit-field type 'long' [35] */
+ /* expect+1: warning: invalid bit-field type 'long' [35] */
long long_flag: 1;
- /* expect+1: warning: illegal bit-field type 'unsigned long' [35] */
+ /* expect+1: warning: invalid bit-field type 'unsigned long' [35] */
unsigned long unsigned_long_flag: 1;
- /* expect+1: warning: illegal bit-field type 'long long' [35] */
+ /* expect+1: warning: invalid bit-field type 'long long' [35] */
long long long_long_flag: 1;
- /* expect+1: warning: illegal bit-field type 'unsigned long long' [35] */
+ /* expect+1: warning: invalid bit-field type 'unsigned long long' [35] */
unsigned long long unsigned_long_long_flag: 1;
/* __int128_t omitted since it is not always defined */
/* __uint128_t omitted since it is not always defined */
- /* expect+1: warning: illegal bit-field type 'float' [35] */
+ /* expect+1: warning: invalid bit-field type 'float' [35] */
float float_flag: 1;
- /* expect+1: warning: illegal bit-field type 'double' [35] */
+ /* expect+1: warning: invalid bit-field type 'double' [35] */
double double_flag: 1;
- /* expect+1: warning: illegal bit-field type 'long double' [35] */
+ /* expect+1: warning: invalid bit-field type 'long double' [35] */
long double long_double_flag: 1;
/* expect+2: error: void type for 'void_flag' [19] */
/* expect+1: error: zero size bit-field [37] */
void void_flag: 1;
- /* expect+1: warning: illegal bit-field type 'struct typedef example_struct' [35] */
+ /* expect+1: warning: invalid bit-field type 'struct typedef example_struct' [35] */
example_struct struct_flag: 1;
- /* expect+1: warning: illegal bit-field type 'union typedef example_union' [35] */
+ /* expect+1: warning: invalid bit-field type 'union typedef example_union' [35] */
example_union union_flag: 1;
example_enum enum_flag: 1;
- /* expect+1: warning: illegal bit-field type 'pointer to void' [35] */
+ /* expect+1: warning: invalid bit-field type 'pointer to void' [35] */
void *pointer_flag: 1;
- /* expect+1: warning: illegal bit-field type 'array[4] of unsigned int' [35] */
+ /* expect+1: warning: invalid bit-field type 'array[4] of unsigned int' [35] */
unsigned int array_flag[4]: 1;
- /* expect+1: warning: illegal bit-field type 'function(int, pointer to const char) returning void' [35] */
+ /* expect+1: warning: invalid bit-field type 'function(int, pointer to const char) returning void' [35] */
example_function function_flag: 1;
/* expect+2: error: invalid type for _Complex [308] */
- /* expect+1: warning: illegal bit-field type 'double _Complex' [35] */
+ /* expect+1: warning: invalid bit-field type 'double _Complex' [35] */
_Complex complex_flag: 1;
- /* expect+1: warning: illegal bit-field type 'float _Complex' [35] */
+ /* expect+1: warning: invalid bit-field type 'float _Complex' [35] */
float _Complex float_complex_flag: 1;
- /* expect+1: warning: illegal bit-field type 'double _Complex' [35] */
+ /* expect+1: warning: invalid bit-field type 'double _Complex' [35] */
double _Complex double_complex_flag: 1;
- /* expect+1: warning: illegal bit-field type 'long double _Complex' [35] */
+ /* expect+1: warning: invalid bit-field type 'long double _Complex' [35] */
long double _Complex long_double_complex_flag: 1;
};
diff --git a/usr.bin/xlint/lint1/msg_036.c b/usr.bin/xlint/lint1/msg_036.c
index 5f5bd6b1f632..c6b85f173f4f 100644
--- a/usr.bin/xlint/lint1/msg_036.c
+++ b/usr.bin/xlint/lint1/msg_036.c
@@ -1,12 +1,12 @@
-/* $NetBSD: msg_036.c,v 1.4 2022/06/15 20:18:31 rillig Exp $ */
+/* $NetBSD: msg_036.c,v 1.5 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_036.c"
-// Test for message: illegal bit-field size: %d [36]
+// Test for message: invalid bit-field size: %d [36]
struct example {
- /* expect+1: error: illegal bit-field size: 160 [36] */
+ /* expect+1: error: invalid bit-field size: 160 [36] */
unsigned int too_large: 100000;
- /* expect+1: error: illegal bit-field size: 255 [36] */
+ /* expect+1: error: invalid bit-field size: 255 [36] */
unsigned int negative: -1;
unsigned int ok: 3;
};
diff --git a/usr.bin/xlint/lint1/msg_038.c b/usr.bin/xlint/lint1/msg_038.c
index 978144bea360..4e5b7d13b8e3 100644
--- a/usr.bin/xlint/lint1/msg_038.c
+++ b/usr.bin/xlint/lint1/msg_038.c
@@ -1,13 +1,13 @@
-/* $NetBSD: msg_038.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_038.c,v 1.5 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_038.c"
-// Test for message: function illegal in structure or union [38]
+// Test for message: function invalid in structure or union [38]
/* lint1-extra-flags: -X 351 */
typedef void (function)(void);
struct {
- /* expect+1: error: function illegal in structure or union [38] */
+ /* expect+1: error: function invalid in structure or union [38] */
function fn;
} s;
diff --git a/usr.bin/xlint/lint1/msg_039.c b/usr.bin/xlint/lint1/msg_039.c
index 9c3b00ac2289..8a54aca2869e 100644
--- a/usr.bin/xlint/lint1/msg_039.c
+++ b/usr.bin/xlint/lint1/msg_039.c
@@ -1,13 +1,13 @@
-/* $NetBSD: msg_039.c,v 1.4 2022/06/20 21:13:36 rillig Exp $ */
+/* $NetBSD: msg_039.c,v 1.5 2023/09/14 21:53:02 rillig Exp $ */
# 3 "msg_039.c"
-/* Test for message: zero-sized array '%s' in struct is a C99 extension [39] */
+/* Test for message: zero-sized array '%s' in struct requires C99 or later [39] */
/* lint1-flags: -w */
struct s {
- /* expect+2: warning: zero sized array is a C99 extension [322] */
- /* expect+1: warning: zero-sized array 'member' in struct is a C99 extension [39] */
+ /* expect+2: warning: zero sized array requires C99 or later [322] */
+ /* expect+1: warning: zero-sized array 'member' in struct requires C99 or later [39] */
char member[0];
char member2;
};
diff --git a/usr.bin/xlint/lint1/msg_044.c b/usr.bin/xlint/lint1/msg_044.c
index 05b80f3a89fc..22f8abea8960 100644
--- a/usr.bin/xlint/lint1/msg_044.c
+++ b/usr.bin/xlint/lint1/msg_044.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_044.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_044.c,v 1.7 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_044.c"
-// Test for message: declaration of '%s %s' introduces new type in ANSI C [44]
+// Test for message: declaration of '%s %s' introduces new type in C90 or later [44]
/* lint1-extra-flags: -X 351 */
@@ -11,7 +11,7 @@ struct tag;
void declaration(struct tag *);
void definition(void) {
- /* expect+2: warning: declaration of 'struct tag' introduces new type in ANSI C [44] */
+ /* expect+2: warning: declaration of 'struct tag' introduces new type in C90 or later [44] */
/* expect+1: warning: struct 'tag' never defined [233] */
struct tag;
}
diff --git a/usr.bin/xlint/lint1/msg_045.c b/usr.bin/xlint/lint1/msg_045.c
index 8b95f093133f..8a69f713af4f 100644
--- a/usr.bin/xlint/lint1/msg_045.c
+++ b/usr.bin/xlint/lint1/msg_045.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_045.c,v 1.6 2022/06/20 21:13:36 rillig Exp $ */
+/* $NetBSD: msg_045.c,v 1.8 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_045.c"
/* Test for message: base type is really '%s %s' [45] */
@@ -12,10 +12,10 @@ struct counter {
function()
{
/* expect+4: warning: base type is really 'struct counter' [45] */
- /* expect+3: warning: declaration of 'union counter' introduces new type in ANSI C [44] */
+ /* expect+3: warning: declaration of 'union counter' introduces new type in C90 or later [44] */
/* expect+2: error: 'counter' has incomplete type 'incomplete union counter' [31] */
/* expect+1: warning: union 'counter' never defined [234] */
union counter counter;
- /* expect+1: warning: illegal use of member 'value' [102] */
+ /* expect+1: warning: invalid use of member 'value' [102] */
counter.value++;
}
diff --git a/usr.bin/xlint/lint1/msg_047.c b/usr.bin/xlint/lint1/msg_047.c
index f58a96a81b2e..047d17ee19a3 100644
--- a/usr.bin/xlint/lint1/msg_047.c
+++ b/usr.bin/xlint/lint1/msg_047.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_047.c,v 1.5 2022/06/20 21:13:36 rillig Exp $ */
+/* $NetBSD: msg_047.c,v 1.6 2023/09/14 21:53:02 rillig Exp $ */
# 3 "msg_047.c"
/* Test for message: zero sized %s is a C99 feature [47] */
@@ -11,8 +11,8 @@ struct empty {
/* expect-1: error: zero sized struct is a C99 feature [47] */
struct zero_sized {
- /* expect+2: error: zero sized array is a C99 extension [322] */
- /* expect+1: error: zero-sized array 'dummy' in struct is a C99 extension [39] */
+ /* expect+2: error: zero sized array requires C99 or later [322] */
+ /* expect+1: error: zero-sized array 'dummy' in struct requires C99 or later [39] */
char dummy[0];
};
/* expect-1: error: zero sized struct is a C99 feature [47] */
diff --git a/usr.bin/xlint/lint1/msg_051.c b/usr.bin/xlint/lint1/msg_051.c
index db352969d217..7d3e2a069d45 100644
--- a/usr.bin/xlint/lint1/msg_051.c
+++ b/usr.bin/xlint/lint1/msg_051.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_051.c,v 1.7 2023/07/09 11:18:55 rillig Exp $ */
+/* $NetBSD: msg_051.c,v 1.9 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_051.c"
// Test for message: parameter mismatch: %d declared, %d defined [51]
@@ -9,6 +9,7 @@ void
example(int, int);
void
+/* expect+4: warning: function definition for 'example' with identifier list is obsolete in C23 [384] */
/* expect+3: warning: parameter 'a' unused in function 'example' [231] */
/* expect+2: warning: parameter 'b' unused in function 'example' [231] */
/* expect+1: warning: parameter 'c' unused in function 'example' [231] */
diff --git a/usr.bin/xlint/lint1/msg_052.c b/usr.bin/xlint/lint1/msg_052.c
index e064ec630d63..4c7f241d4c15 100644
--- a/usr.bin/xlint/lint1/msg_052.c
+++ b/usr.bin/xlint/lint1/msg_052.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_052.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_052.c,v 1.7 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_052.c"
// Test for message: cannot initialize parameter '%s' [52]
@@ -6,6 +6,7 @@
/* lint1-extra-flags: -X 351 */
int
+/* expect+1: warning: function definition for 'definition' with identifier list is obsolete in C23 [384] */
definition(i)
/* expect+1: error: cannot initialize parameter 'i' [52] */
int i = 3;
diff --git a/usr.bin/xlint/lint1/msg_053.c b/usr.bin/xlint/lint1/msg_053.c
index 343117df85f0..f81b7089f81a 100644
--- a/usr.bin/xlint/lint1/msg_053.c
+++ b/usr.bin/xlint/lint1/msg_053.c
@@ -1,12 +1,13 @@
-/* $NetBSD: msg_053.c,v 1.8 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: msg_053.c,v 1.10 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_053.c"
// Test for message: declared parameter '%s' is missing [53]
/* lint1-extra-flags: -X 351 */
-/* expect+2: error: old-style declaration; add 'int' [1] */
+/* expect+1: warning: function definition for 'oldstyle' with identifier list is obsolete in C23 [384] */
oldstyle(parameter)
+ /* expect+1: error: old-style declaration; add 'int' [1] */
int parameter;
/* expect+1: error: declared parameter 'extra_parameter' is missing [53] */
int extra_parameter;
diff --git a/usr.bin/xlint/lint1/msg_056.c b/usr.bin/xlint/lint1/msg_056.c
index 2974407003f5..870c2c2573bc 100644
--- a/usr.bin/xlint/lint1/msg_056.c
+++ b/usr.bin/xlint/lint1/msg_056.c
@@ -1,10 +1,45 @@
-/* $NetBSD: msg_056.c,v 1.4 2022/06/15 20:18:31 rillig Exp $ */
+/* $NetBSD: msg_056.c,v 1.7 2024/11/20 23:01:52 rillig Exp $ */
# 3 "msg_056.c"
-// Test for message: integral constant too large [56]
+// Test for message: constant %s too large for 'int' [56]
-enum color {
- /* expect+1: warning: integer constant out of range [252] */
- WHITE = 0xFFFFFFFFFFFFFFFFFFFF
+/* lint1-extra-flags: -h */
+
+enum {
+ S31_MAX = 0x7FFFFFFF,
+ U31_MAX = 0x7FFFFFFFU,
+
+ // The hexadecimal constant has type 'int', since it fits.
+ /* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */
+ S31_MAX_PLUS_1 = 0x7FFFFFFF + 1,
+
+ /* expect+1: warning: constant 0x80000000 too large for 'int' [56] */
+ U31_MAX_PLUS_1 = 0x7FFFFFFFU + 1,
+
+
+ /* expect+1: warning: constant 0xffffffff too large for 'int' [56] */
+ U32_MAX = 0xFFFFFFFF,
+
+ /* expect+2: warning: '9223372036854775807 + 1' overflows 'long long' [141] */
+ /* expect+1: warning: constant 0x7fffffffffffffff too large for 'int' [56] */
+ S63_MAX_PLUS_1 = 0x7FFFFFFFFFFFFFFFLL + 1,
+
+ /* expect+1: warning: constant -0x8000000000000000 too large for 'int' [56] */
+ S63_MIN = -0x7FFFFFFFFFFFFFFF - 1,
+
+ /* expect+1: warning: constant 0x7fffffffffffffff too large for 'int' [56] */
+ S63_MAX = 0x7FFFFFFFFFFFFFFF,
+
+ /* expect+1: warning: constant 0x7fffffffffffffff too large for 'int' [56] */
+ U63_MAX = 0x7FFFFFFFFFFFFFFFU,
+
+ /* expect+1: warning: constant 0x8000000000000000 too large for 'int' [56] */
+ U63_MAX_PLUS_1 = 0x8000000000000000U,
+
+ /* expect+1: warning: constant 0xffffffffffffffff too large for 'int' [56] */
+ U64_MAX = 0xFFFFFFFFFFFFFFFF,
+
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: constant 0xffffffffffffffff too large for 'int' [56] */
+ U80_MAX = 0xFFFFFFFFFFFFFFFFFFFF,
};
-/* expect-1: warning: integral constant too large [56] */
diff --git a/usr.bin/xlint/lint1/msg_058.c b/usr.bin/xlint/lint1/msg_058.c
index d8780319ef77..7617d628e22c 100644
--- a/usr.bin/xlint/lint1/msg_058.c
+++ b/usr.bin/xlint/lint1/msg_058.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_058.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_058.c,v 1.7 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_058.c"
// Test for message: type of '%s' does not match prototype [58]
@@ -8,6 +8,7 @@
int function(int, char, const char *);
int
+/* expect+1: warning: function definition for 'function' with identifier list is obsolete in C23 [384] */
function(i, dbl, str)
int i;
double dbl;
diff --git a/usr.bin/xlint/lint1/msg_062.c b/usr.bin/xlint/lint1/msg_062.c
index d6a9baf4819d..83c0ac3a8760 100644
--- a/usr.bin/xlint/lint1/msg_062.c
+++ b/usr.bin/xlint/lint1/msg_062.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_062.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_062.c,v 1.9 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_062.c"
// Test for message: function prototype parameters must have types [62]
@@ -7,6 +7,7 @@
/* expect+1: error: old-style declaration; add 'int' [1] */
outer() {
+ /* expect+3: warning: function definition for 'inner' with identifier list is obsolete in C23 [384] */
/* expect+2: warning: function prototype parameters must have types [62] */
/* expect+1: warning: dubious static function 'inner' at block level [93] */
static int inner(a);
diff --git a/usr.bin/xlint/lint1/msg_063.c b/usr.bin/xlint/lint1/msg_063.c
index 6473a14900b9..890c2d9515af 100644
--- a/usr.bin/xlint/lint1/msg_063.c
+++ b/usr.bin/xlint/lint1/msg_063.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_063.c,v 1.4 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_063.c,v 1.6 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_063.c"
// Test for message: prototype does not match old-style definition [63]
@@ -6,6 +6,7 @@
/* lint1-extra-flags: -X 351 */
int
+/* expect+1: warning: function definition for 'function' with identifier list is obsolete in C23 [384] */
function(a, b)
int a, b;
{
diff --git a/usr.bin/xlint/lint1/msg_068.c b/usr.bin/xlint/lint1/msg_068.c
index b123aea160ce..ebbebf426ce9 100644
--- a/usr.bin/xlint/lint1/msg_068.c
+++ b/usr.bin/xlint/lint1/msg_068.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_068.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_068.c,v 1.6 2024/11/30 11:27:20 rillig Exp $ */
# 3 "msg_068.c"
// Test for message: typedef already qualified with '%s' [68]
@@ -9,3 +9,14 @@ typedef const char const_char;
/* expect+1: warning: typedef already qualified with 'const' [68] */
const const_char twice_const;
+
+typedef volatile char volatile_char;
+
+/* expect+1: warning: typedef already qualified with 'volatile' [68] */
+volatile volatile_char twice_volatile;
+
+typedef const volatile char const_volatile_char;
+
+/* expect+2: warning: typedef already qualified with 'const' [68] */
+/* expect+1: warning: typedef already qualified with 'volatile' [68] */
+const volatile const_volatile_char twice_const_volatile;
diff --git a/usr.bin/xlint/lint1/msg_070.c b/usr.bin/xlint/lint1/msg_070.c
index 6c4e3d1f8196..ef5d0ad98f1d 100644
--- a/usr.bin/xlint/lint1/msg_070.c
+++ b/usr.bin/xlint/lint1/msg_070.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_070.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_070.c,v 1.5 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_070.c"
-// Test for message: %soperand of '%s' is unsigned in ANSI C [70]
+// Test for message: %soperand of '%s' is unsigned in C90 [70]
/* This message is not used. */
typedef int dummy;
diff --git a/usr.bin/xlint/lint1/msg_074.c b/usr.bin/xlint/lint1/msg_074.c
index dc09f8907396..d1cdd987f2fa 100644
--- a/usr.bin/xlint/lint1/msg_074.c
+++ b/usr.bin/xlint/lint1/msg_074.c
@@ -1,16 +1,31 @@
-/* $NetBSD: msg_074.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_074.c,v 1.8 2024/02/03 19:18:36 rillig Exp $ */
# 3 "msg_074.c"
// Test for message: no hex digits follow \x [74]
+//
+// See also:
+// msg_075.c overflow in hex escape
/* lint1-extra-flags: -X 351 */
/* expect+1: error: no hex digits follow \x [74] */
-char invalid_hex = '\x';
-
+char char_invalid_hex = '\x';
/* expect+2: error: no hex digits follow \x [74] */
/* expect+1: warning: multi-character character constant [294] */
-char invalid_hex_letter = '\xg';
+char char_invalid_hex_letter = '\xg';
-char valid_hex = '\xff';
-char valid_single_digit_hex = '\xa';
+/* expect+1: error: no hex digits follow \x [74] */
+int wide_invalid_hex = L'\x';
+/* expect+2: error: no hex digits follow \x [74] */
+/* expect+1: error: too many characters in character constant [71] */
+int wide_invalid_hex_letter = L'\xg';
+
+/* expect+1: error: no hex digits follow \x [74] */
+char char_string_invalid_hex[] = "\x";
+/* expect+1: error: no hex digits follow \x [74] */
+char char_string_invalid_hex_letter[] = "\xg";
+
+/* expect+1: error: no hex digits follow \x [74] */
+int wide_string_invalid_hex[] = L"\x";
+/* expect+1: error: no hex digits follow \x [74] */
+int wide_string_invalid_hex_letter[] = L"\xg";
diff --git a/usr.bin/xlint/lint1/msg_075.c b/usr.bin/xlint/lint1/msg_075.c
index 29241080c0e5..3f290b80ca28 100644
--- a/usr.bin/xlint/lint1/msg_075.c
+++ b/usr.bin/xlint/lint1/msg_075.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_075.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_075.c,v 1.10 2024/02/03 19:18:36 rillig Exp $ */
# 3 "msg_075.c"
// Test for message: overflow in hex escape [75]
@@ -19,3 +19,65 @@ char str[] = "\x12345678123456781234567812345678";
/* C11 6.4.4.4p7 */
char leading_zeroes = '\x0000000000000000000000000000020';
+
+char char_hex4bit = '\xf';
+char char_hex7bit = '\x7f';
+char char_hex8bit = '\xff';
+/* expect+1: warning: overflow in hex escape [75] */
+char char_hex9bit = '\x100';
+/* expect+1: warning: overflow in hex escape [75] */
+char char_hex16bit = '\xffff';
+/* expect+1: warning: overflow in hex escape [75] */
+char char_hex20bit = '\xfffff';
+/* expect+1: warning: overflow in hex escape [75] */
+char char_hex31bit = '\x7fffffff';
+/* expect+1: warning: overflow in hex escape [75] */
+char char_hex32bit = '\xffffffff';
+/* expect+1: warning: overflow in hex escape [75] */
+char char_hex33bit = '\x1000000ff';
+/* expect+1: warning: overflow in hex escape [75] */
+char char_hex36bit = '\xfffffffff';
+
+int wide_hex4bit = L'\xf';
+int wide_hex7bit = L'\x7f';
+int wide_hex8bit = L'\xff';
+int wide_hex9bit = L'\x100';
+int wide_hex16bit = L'\xffff';
+int wide_hex20bit = L'\xfffff';
+int wide_hex31bit = L'\x7fffffff';
+int wide_hex32bit = L'\xffffffff';
+/* expect+1: warning: overflow in hex escape [75] */
+int wide_hex33bit = L'\x1000000ff';
+/* expect+1: warning: overflow in hex escape [75] */
+int wide_hex36bit = L'\xfffffffff';
+
+char char_string_hex4bit[] = "\xf";
+char char_string_hex7bit[] = "\x7f";
+char char_string_hex8bit[] = "\xff";
+/* expect+1: warning: overflow in hex escape [75] */
+char char_string_hex9bit[] = "\x100";
+/* expect+1: warning: overflow in hex escape [75] */
+char char_string_hex16bit[] = "\xffff";
+/* expect+1: warning: overflow in hex escape [75] */
+char char_string_hex20bit[] = "\xfffff";
+/* expect+1: warning: overflow in hex escape [75] */
+char char_string_hex31bit[] = "\x7fffffff";
+/* expect+1: warning: overflow in hex escape [75] */
+char char_string_hex32bit[] = "\xffffffff";
+/* expect+1: warning: overflow in hex escape [75] */
+char char_string_hex33bit[] = "\x1000000ff";
+/* expect+1: warning: overflow in hex escape [75] */
+char char_string_hex36[] = "\xfffffffff";
+
+int wide_string_hex4bit[] = L"\xf";
+int wide_string_hex7bit[] = L"\x7f";
+int wide_string_hex8bit[] = L"\xff";
+int wide_string_hex9bit[] = L"\x100";
+int wide_string_hex16bit[] = L"\xffff";
+int wide_string_hex20bit[] = L"\xfffff";
+int wide_string_hex31bit[] = L"\x7fffffff";
+int wide_string_hex32bit[] = L"\xffffffff";
+/* expect+1: warning: overflow in hex escape [75] */
+int wide_string_hex33bit[] = L"\x1000000ff";
+/* expect+1: warning: overflow in hex escape [75] */
+int wide_string_hex36bit[] = L"\xfffffffff";
diff --git a/usr.bin/xlint/lint1/msg_076.c b/usr.bin/xlint/lint1/msg_076.c
index 86b8121a7aad..2ce4dc81d40a 100644
--- a/usr.bin/xlint/lint1/msg_076.c
+++ b/usr.bin/xlint/lint1/msg_076.c
@@ -1,9 +1,36 @@
-/* $NetBSD: msg_076.c,v 1.5 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_076.c,v 1.8 2024/02/03 10:01:59 rillig Exp $ */
# 3 "msg_076.c"
// Test for message: character escape does not fit in character [76]
+//
+// See also:
+// msg_075.c for hex escapes
/* lint1-extra-flags: -X 351 */
+char char_255 = '\377';
/* expect+1: warning: character escape does not fit in character [76] */
-char ch = '\777';
+char char_256 = '\400';
+/* expect+1: warning: character escape does not fit in character [76] */
+char char_511 = '\777';
+/* expect+2: warning: multi-character character constant [294] */
+/* expect+1: warning: initializer does not fit [178] */
+char char_512 = '\1000';
+
+int wide_255 = L'\377';
+int wide_256 = L'\400';
+int wide_511 = L'\777';
+/* expect+1: error: too many characters in character constant [71] */
+int wide_512 = L'\1000';
+
+char char_string_255[] = "\377";
+/* expect+1: warning: character escape does not fit in character [76] */
+char char_string_256[] = "\400";
+/* expect+1: warning: character escape does not fit in character [76] */
+char char_string_511[] = "\777";
+char char_string_512[] = "\1000";
+
+int wide_string_255[] = L"\377";
+int wide_string_256[] = L"\400";
+int wide_string_511[] = L"\777";
+int wide_string_512[] = L"\1000";
diff --git a/usr.bin/xlint/lint1/msg_077.c b/usr.bin/xlint/lint1/msg_077.c
index 7e848622963a..bdd1060b8e76 100644
--- a/usr.bin/xlint/lint1/msg_077.c
+++ b/usr.bin/xlint/lint1/msg_077.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_077.c,v 1.8 2023/07/09 11:01:27 rillig Exp $ */
+/* $NetBSD: msg_077.c,v 1.9 2024/02/03 20:10:10 rillig Exp $ */
# 3 "msg_077.c"
/* Test for message: bad octal digit '%c' [77] */
@@ -23,5 +23,6 @@ char single_digit = '\8';
* anyway.
* https://mail-index.netbsd.org/tech-toolchain/2021/03/16/msg003933.html
*/
+/* expect+2: warning: short octal escape '\0' followed by digit '8' [356] */
/* expect+1: warning: multi-character character constant [294] */
char several_digits = '\08';
diff --git a/usr.bin/xlint/lint1/msg_079.c b/usr.bin/xlint/lint1/msg_079.c
index 4e590a2df243..7bb5ebab8b06 100644
--- a/usr.bin/xlint/lint1/msg_079.c
+++ b/usr.bin/xlint/lint1/msg_079.c
@@ -1,16 +1,22 @@
-/* $NetBSD: msg_079.c,v 1.4 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_079.c,v 1.6 2024/02/02 19:07:58 rillig Exp $ */
# 3 "msg_079.c"
// Test for message: dubious escape \%c [79]
+/* \e is only accepted in GCC mode. */
+
/* lint1-extra-flags: -X 351 */
-int my_printf(const char *, ...);
+char char_e = '\e';
+/* expect+1: warning: dubious escape \y [79] */
+char char_y = '\y';
+int wide_e = L'\e';
+/* expect+1: warning: dubious escape \y [79] */
+int wide_y = L'\y';
-void
-print_color(_Bool red, _Bool green, _Bool blue)
-{
- /* expect+1: warning: dubious escape \e [79] */
- my_printf("\e[%dm",
- 30 + (red ? 1 : 0) + (green ? 2 : 0) + (blue ? 4 : 0));
-}
+char char_string_e[] = "\e[0m";
+/* expect+1: warning: dubious escape \y [79] */
+char char_string_y[] = "\y[0m";
+int wide_string_e[] = L"\e[0m";
+/* expect+1: warning: dubious escape \y [79] */
+int wide_string_y[] = L"\y[0m";
diff --git a/usr.bin/xlint/lint1/msg_080.c b/usr.bin/xlint/lint1/msg_080.c
index 60c5fca1f1a6..55ee7e318b87 100644
--- a/usr.bin/xlint/lint1/msg_080.c
+++ b/usr.bin/xlint/lint1/msg_080.c
@@ -1,9 +1,24 @@
-/* $NetBSD: msg_080.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_080.c,v 1.7 2024/02/02 19:07:58 rillig Exp $ */
# 3 "msg_080.c"
// Test for message: dubious escape \%o [80]
/* lint1-extra-flags: -X 351 */
+/* expect+1: warning: dubious escape \11 [80] */
+char char_backslash_tab = '\ ';
/* expect+1: warning: dubious escape \177 [80] */
-char backslash_delete = '\';
+char char_backslash_delete = '\';
+/* expect+1: warning: dubious escape \11 [80] */
+int wide_backslash_tab = L'\ ';
+/* expect+1: warning: dubious escape \177 [80] */
+int wide_backslash_delete = L'\';
+
+/* expect+1: warning: dubious escape \11 [80] */
+char char_string_backslash_tab[] = "\ ";
+/* expect+1: warning: dubious escape \177 [80] */
+char char_string_backslash_delete[] = "\";
+/* expect+1: warning: dubious escape \11 [80] */
+int wide_string_backslash_tab[] = L"\ ";
+/* expect+1: warning: dubious escape \177 [80] */
+int wide_string_backslash_delete[] = L"\";
diff --git a/usr.bin/xlint/lint1/msg_081.c b/usr.bin/xlint/lint1/msg_081.c
index 3dda84b71904..d708df0cfb18 100644
--- a/usr.bin/xlint/lint1/msg_081.c
+++ b/usr.bin/xlint/lint1/msg_081.c
@@ -1,9 +1,11 @@
-/* $NetBSD: msg_081.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_081.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_081.c"
-/* Test for message: \a undefined in traditional C [81] */
+/* Test for message: \a requires C90 or later [81] */
/* lint1-flags: -tw -X 351 */
-/* expect+1: warning: \a undefined in traditional C [81] */
-char str[] = "The bell\a rings";
+/* expect+1: warning: \a requires C90 or later [81] */
+char char_a = '\a';
+/* expect+1: warning: \a requires C90 or later [81] */
+char char_string_a[] = "The bell\a rings";
diff --git a/usr.bin/xlint/lint1/msg_082.c b/usr.bin/xlint/lint1/msg_082.c
index 1301abcb9459..1a389e99ca5b 100644
--- a/usr.bin/xlint/lint1/msg_082.c
+++ b/usr.bin/xlint/lint1/msg_082.c
@@ -1,9 +1,11 @@
-/* $NetBSD: msg_082.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_082.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_082.c"
-/* Test for message: \x undefined in traditional C [82] */
+/* Test for message: \x requires C90 or later [82] */
/* lint1-flags: -Stw -X 351 */
-/* expect+1: warning: \x undefined in traditional C [82] */
-char str[] = "A he\x78 escape";
+/* expect+1: warning: \x requires C90 or later [82] */
+char char_hex = '\x78';
+/* expect+1: warning: \x requires C90 or later [82] */
+char char_string_hex[] = "\x78";
diff --git a/usr.bin/xlint/lint1/msg_083.c b/usr.bin/xlint/lint1/msg_083.c
index 7aa9ec36cf1e..1a537c27c5e9 100644
--- a/usr.bin/xlint/lint1/msg_083.c
+++ b/usr.bin/xlint/lint1/msg_083.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_083.c,v 1.7 2023/07/07 06:03:31 rillig Exp $ */
+/* $NetBSD: msg_083.c,v 1.8 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_083.c"
// Test for message: storage class after type is obsolescent [83]
@@ -8,8 +8,8 @@
void
example(void)
{
- /* expect+2: warning: 'x' unused in function 'example' [192] */
- /* expect+1: warning: storage class after type is obsolescent [83] */
+ /* expect+2: warning: storage class after type is obsolescent [83] */
+ /* expect+1: warning: 'x' unused in function 'example' [192] */
int register x;
}
diff --git a/usr.bin/xlint/lint1/msg_084.c b/usr.bin/xlint/lint1/msg_084.c
index 0a956b03d64f..e907c5429362 100644
--- a/usr.bin/xlint/lint1/msg_084.c
+++ b/usr.bin/xlint/lint1/msg_084.c
@@ -1,11 +1,11 @@
-/* $NetBSD: msg_084.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_084.c,v 1.6 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_084.c"
-/* Test for message: ANSI C requires formal parameter before '...' [84] */
+/* Test for message: C90 to C17 require formal parameter before '...' [84] */
/* lint1-flags: -sw -X 351 */
-/* expect+2: error: ANSI C requires formal parameter before '...' [84] */
+/* expect+2: error: C90 to C17 require formal parameter before '...' [84] */
void
only_ellipsis(...)
{
diff --git a/usr.bin/xlint/lint1/msg_086.c b/usr.bin/xlint/lint1/msg_086.c
index a2e777fc52ce..d3b1dfd2b689 100644
--- a/usr.bin/xlint/lint1/msg_086.c
+++ b/usr.bin/xlint/lint1/msg_086.c
@@ -1,23 +1,26 @@
-/* $NetBSD: msg_086.c,v 1.7 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: msg_086.c,v 1.8 2024/10/14 18:43:24 rillig Exp $ */
# 3 "msg_086.c"
-// Test for message: automatic '%s' hides external declaration [86]
+// Test for message: automatic '%s' hides external declaration with type '%s' [86]
/* lint1-flags: -S -g -h -w -X 351 */
-extern int identifier;
+extern double variable;
+void parameter(double);
+void err(int, const char *, ...);
-int
-local_auto(void)
-{
- /* expect+1: warning: automatic 'identifier' hides external declaration [86] */
- int identifier = 3;
- return identifier;
-}
+int sink;
+void
/* XXX: the function parameter does not trigger the warning. */
-int
-arg_auto(int identifier)
+local_(int parameter)
{
- return identifier;
+ /* expect+1: warning: automatic 'variable' hides external declaration with type 'double' [86] */
+ int variable = 3;
+ /* expect+1: warning: automatic 'err' hides external declaration with type 'function(int, pointer to const char, ...) returning void' [86] */
+ int err = 5;
+
+ sink = variable;
+ sink = parameter;
+ sink = err;
}
diff --git a/usr.bin/xlint/lint1/msg_087.c b/usr.bin/xlint/lint1/msg_087.c
index 22304f7447b7..15c29b2825a7 100644
--- a/usr.bin/xlint/lint1/msg_087.c
+++ b/usr.bin/xlint/lint1/msg_087.c
@@ -1,16 +1,16 @@
-/* $NetBSD: msg_087.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_087.c,v 1.7 2024/10/14 18:43:24 rillig Exp $ */
# 3 "msg_087.c"
-// Test for message: static '%s' hides external declaration [87]
+// Test for message: static '%s' hides external declaration with type '%s' [87]
/* lint1-flags: -g -h -S -w -X 351 */
-extern int counter;
+extern long counter;
int
count(void)
{
- /* expect+1: warning: static 'counter' hides external declaration [87] */
+ /* expect+1: warning: static 'counter' hides external declaration with type 'long' [87] */
static int counter;
return counter++;
}
diff --git a/usr.bin/xlint/lint1/msg_088.c b/usr.bin/xlint/lint1/msg_088.c
index f90a637340dc..0d57dc530cb3 100644
--- a/usr.bin/xlint/lint1/msg_088.c
+++ b/usr.bin/xlint/lint1/msg_088.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_088.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_088.c,v 1.7 2024/10/14 18:43:24 rillig Exp $ */
# 3 "msg_088.c"
-// Test for message: typedef '%s' hides external declaration [88]
+// Test for message: typedef '%s' hides external declaration with type '%s' [88]
/* lint1-flags: -g -h -S -w -X 351 */
@@ -10,6 +10,6 @@ extern int identifier;
void
func(void)
{
- /* expect+1: warning: typedef 'identifier' hides external declaration [88] */
+ /* expect+1: warning: typedef 'identifier' hides external declaration with type 'int' [88] */
typedef double identifier;
}
diff --git a/usr.bin/xlint/lint1/msg_090.c b/usr.bin/xlint/lint1/msg_090.c
index a32383155471..f32d614e51ce 100644
--- a/usr.bin/xlint/lint1/msg_090.c
+++ b/usr.bin/xlint/lint1/msg_090.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_090.c,v 1.7 2023/07/07 06:03:31 rillig Exp $ */
+/* $NetBSD: msg_090.c,v 1.8 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_090.c"
// Test for message: inconsistent redeclaration of extern '%s' [90]
@@ -10,8 +10,8 @@ extern int random_number(void);
void
use(void)
{
- /* expect+3: warning: 'random_number' unused in function 'use' [192] */
- /* expect+2: warning: nested 'extern' declaration of 'random_number' [352] */
- /* expect+1: warning: inconsistent redeclaration of extern 'random_number' [90] */
+ /* expect+3: warning: nested 'extern' declaration of 'random_number' [352] */
+ /* expect+2: warning: inconsistent redeclaration of extern 'random_number' [90] */
+ /* expect+1: warning: 'random_number' unused in function 'use' [192] */
extern int random_number(int);
}
diff --git a/usr.bin/xlint/lint1/msg_092.c b/usr.bin/xlint/lint1/msg_092.c
index a220f42f4404..a4a09a9882ef 100644
--- a/usr.bin/xlint/lint1/msg_092.c
+++ b/usr.bin/xlint/lint1/msg_092.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_092.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_092.c,v 1.7 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_092.c"
// Test for message: inconsistent redeclaration of static '%s' [92]
@@ -16,8 +16,8 @@ use_random(void)
{
random();
- /* expect+3: warning: 'random' unused in function 'use_random' [192] */
- /* expect+2: warning: dubious static function 'random' at block level [93] */
- /* expect+1: warning: inconsistent redeclaration of static 'random' [92] */
+ /* expect+3: warning: dubious static function 'random' at block level [93] */
+ /* expect+2: warning: inconsistent redeclaration of static 'random' [92] */
+ /* expect+1: warning: 'random' unused in function 'use_random' [192] */
static double random(void);
}
diff --git a/usr.bin/xlint/lint1/msg_094.c b/usr.bin/xlint/lint1/msg_094.c
index fab909eb855c..f2c807348cef 100644
--- a/usr.bin/xlint/lint1/msg_094.c
+++ b/usr.bin/xlint/lint1/msg_094.c
@@ -1,15 +1,15 @@
-/* $NetBSD: msg_094.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_094.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_094.c"
-// Test for message: function '%s' has illegal storage class [94]
+// Test for message: function '%s' has invalid storage class [94]
/* lint1-extra-flags: -X 351 */
-/* expect+2: error: illegal storage class [8] */
+/* expect+2: error: invalid storage class [8] */
register int
global_example(int arg)
{
- /* expect+1: error: function 'register_example' has illegal storage class [94] */
+ /* expect+1: error: function 'register_example' has invalid storage class [94] */
register int register_example(int);
return arg;
diff --git a/usr.bin/xlint/lint1/msg_095.c b/usr.bin/xlint/lint1/msg_095.c
index 5e83b6d42c1a..29cbc007b28e 100644
--- a/usr.bin/xlint/lint1/msg_095.c
+++ b/usr.bin/xlint/lint1/msg_095.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_095.c,v 1.7 2023/07/07 06:03:31 rillig Exp $ */
+/* $NetBSD: msg_095.c,v 1.8 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_095.c"
// Test for message: declaration of '%s' hides earlier one [95]
@@ -12,8 +12,8 @@ example(int identifier)
{
{
- /* expect+2: warning: 'identifier' set but not used in function 'example' [191] */
- /* expect+1: warning: declaration of 'identifier' hides earlier one [95] */
+ /* expect+2: warning: declaration of 'identifier' hides earlier one [95] */
+ /* expect+1: warning: 'identifier' set but not used in function 'example' [191] */
int identifier = 3;
}
diff --git a/usr.bin/xlint/lint1/msg_097.c b/usr.bin/xlint/lint1/msg_097.c
index 37bc34a10016..c213aa27c62a 100644
--- a/usr.bin/xlint/lint1/msg_097.c
+++ b/usr.bin/xlint/lint1/msg_097.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_097.c,v 1.6 2023/07/09 11:18:55 rillig Exp $ */
+/* $NetBSD: msg_097.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_097.c"
-/* Test for message: suffix 'U' is illegal in traditional C [97] */
+/* Test for message: suffix 'U' requires C90 or later [97] */
/* lint1-flags: -gtw -X 191 */
@@ -11,16 +11,16 @@ example()
int i = 1234567;
unsigned u = 1234567;
- /* expect+1: warning: suffix 'U' is illegal in traditional C [97] */
+ /* expect+1: warning: suffix 'U' requires C90 or later [97] */
unsigned u_upper = 1234567U;
- /* expect+1: warning: suffix 'U' is illegal in traditional C [97] */
+ /* expect+1: warning: suffix 'U' requires C90 or later [97] */
unsigned u_lower = 1234567u;
long l = 1234567L;
- /* expect+1: warning: suffix 'U' is illegal in traditional C [97] */
+ /* expect+1: warning: suffix 'U' requires C90 or later [97] */
unsigned long ul = 1234567UL;
long long ll = 1234567LL;
- /* expect+1: warning: suffix 'U' is illegal in traditional C [97] */
+ /* expect+1: warning: suffix 'U' requires C90 or later [97] */
unsigned long long ull = 1234567ULL;
}
diff --git a/usr.bin/xlint/lint1/msg_098.c b/usr.bin/xlint/lint1/msg_098.c
index 45fc0cafff3c..666cd7400ca8 100644
--- a/usr.bin/xlint/lint1/msg_098.c
+++ b/usr.bin/xlint/lint1/msg_098.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_098.c,v 1.6 2023/07/09 11:18:55 rillig Exp $ */
+/* $NetBSD: msg_098.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_098.c"
-/* Test for message: suffixes 'F' and 'L' are illegal in traditional C [98] */
+/* Test for message: suffixes 'F' or 'L' require C90 or later [98] */
/* lint1-flags: -gtw */
@@ -9,18 +9,18 @@ void
example()
{
float f = 1234.5;
- /* expect+1: warning: suffixes 'F' and 'L' are illegal in traditional C [98] */
+ /* expect+1: warning: suffixes 'F' or 'L' require C90 or later [98] */
float f_F = 1234.5F;
- /* expect+1: warning: suffixes 'F' and 'L' are illegal in traditional C [98] */
+ /* expect+1: warning: suffixes 'F' or 'L' require C90 or later [98] */
float f_f = 1234.5f;
double d = 1234.5;
/* expect+1: error: syntax error 'U' [249] */
double d_U = 1234.5U;
- /* expect+1: warning: 'long double' is illegal in traditional C [266] */
+ /* expect+1: warning: 'long double' requires C90 or later [266] */
long double ld = 1234.5;
- /* expect+2: warning: 'long double' is illegal in traditional C [266] */
- /* expect+1: warning: suffixes 'F' and 'L' are illegal in traditional C [98] */
+ /* expect+2: warning: 'long double' requires C90 or later [266] */
+ /* expect+1: warning: suffixes 'F' or 'L' require C90 or later [98] */
long double ld_L = 1234.5L;
}
diff --git a/usr.bin/xlint/lint1/msg_100.c b/usr.bin/xlint/lint1/msg_100.c
index 8f68df74706f..bbcf9af59bc9 100644
--- a/usr.bin/xlint/lint1/msg_100.c
+++ b/usr.bin/xlint/lint1/msg_100.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_100.c,v 1.6 2022/06/20 21:13:36 rillig Exp $ */
+/* $NetBSD: msg_100.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_100.c"
-/* Test for message: unary '+' is illegal in traditional C [100] */
+/* Test for message: unary '+' requires C90 or later [100] */
/* lint1-flags: -tw */
@@ -9,6 +9,6 @@ int
unary_plus(x)
int x;
{
- /* expect+1: warning: unary '+' is illegal in traditional C [100] */
+ /* expect+1: warning: unary '+' requires C90 or later [100] */
return +x;
}
diff --git a/usr.bin/xlint/lint1/msg_102.c b/usr.bin/xlint/lint1/msg_102.c
index 91c9aea2fc43..589f2c22df67 100644
--- a/usr.bin/xlint/lint1/msg_102.c
+++ b/usr.bin/xlint/lint1/msg_102.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_102.c,v 1.6 2023/06/30 21:06:18 rillig Exp $ */
+/* $NetBSD: msg_102.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_102.c"
-// Test for message: illegal use of member '%s' [102]
+// Test for message: invalid use of member '%s' [102]
// Anonymous members are defined in C11 6.7.2.1p2.
@@ -41,7 +41,7 @@ eq(int x)
* possible but discouraged to access members of other structs via
* their plain name.
*/
- /* expect+2: error: illegal use of member 'bits' [102] */
- /* expect+1: error: illegal use of member 'bits' [102] */
+ /* expect+2: error: invalid use of member 'bits' [102] */
+ /* expect+1: error: invalid use of member 'bits' [102] */
return b1->bits == b2->bits;
}
diff --git a/usr.bin/xlint/lint1/msg_105.c b/usr.bin/xlint/lint1/msg_105.c
index 6e6af7d22250..5069fe6703d6 100644
--- a/usr.bin/xlint/lint1/msg_105.c
+++ b/usr.bin/xlint/lint1/msg_105.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_105.c,v 1.4 2022/06/19 12:14:34 rillig Exp $ */
+/* $NetBSD: msg_105.c,v 1.5 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_105.c"
/* Test for message: non-unique member requires struct/union %s [105] */
@@ -41,6 +41,6 @@ int
member_of_wrong_struct(t)
struct three *t;
{
- /* expect+1: error: illegal use of member 'member' [102] */
+ /* expect+1: error: invalid use of member 'member' [102] */
return t->member;
}
diff --git a/usr.bin/xlint/lint1/msg_107.c b/usr.bin/xlint/lint1/msg_107.c
index ec5438dec914..bb736dfefb29 100644
--- a/usr.bin/xlint/lint1/msg_107.c
+++ b/usr.bin/xlint/lint1/msg_107.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_107.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_107.c,v 1.7 2024/01/07 21:19:42 rillig Exp $ */
# 3 "msg_107.c"
// Test for message: operands of '%s' have incompatible types '%s' and '%s' [107]
@@ -12,3 +12,12 @@ compare(double d, void *ptr)
/* expect+1: error: operands of '==' have incompatible types 'double' and 'pointer to void' [107] */
return d == ptr;
}
+
+static inline void
+typeok_minus(const char *p, int i, double d)
+{
+ if (p[i] != p[(int)d])
+ return;
+ /* expect+1: error: operands of '-' have incompatible types 'pointer to const char' and 'double' [107] */
+ return (p - i) - (p - d);
+}
diff --git a/usr.bin/xlint/lint1/msg_109.c b/usr.bin/xlint/lint1/msg_109.c
index 9453cab09510..58a3faeb401c 100644
--- a/usr.bin/xlint/lint1/msg_109.c
+++ b/usr.bin/xlint/lint1/msg_109.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_109.c,v 1.7 2023/08/06 19:44:50 rillig Exp $ */
+/* $NetBSD: msg_109.c,v 1.8 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_109.c"
-// Test for message: void type illegal in expression [109]
+// Test for message: void type invalid in expression [109]
/* lint1-extra-flags: -X 351 */
@@ -9,7 +9,7 @@
int
example(int arg)
{
- /* expect+2: error: void type illegal in expression [109] */
+ /* expect+2: error: void type invalid in expression [109] */
/* expect+1: error: function 'example' expects to return value [214] */
return arg + (void)4;
}
diff --git a/usr.bin/xlint/lint1/msg_111.c b/usr.bin/xlint/lint1/msg_111.c
index 72e87dc1a9f9..71fb4ba1f392 100644
--- a/usr.bin/xlint/lint1/msg_111.c
+++ b/usr.bin/xlint/lint1/msg_111.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_111.c,v 1.3 2022/06/16 16:58:36 rillig Exp $ */
+/* $NetBSD: msg_111.c,v 1.4 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_111.c"
/* Test for message: unacceptable operand of '%s' [111] */
@@ -10,9 +10,9 @@ struct s {
};
void
-illegal_member_access()
+invalid_member_access()
{
/* expect+2: warning: left operand of '.' must be struct or union, not 'function() returning void' [103] */
/* expect+1: error: unacceptable operand of '.' [111] */
- return illegal_member_access.member;
+ return invalid_member_access.member;
}
diff --git a/usr.bin/xlint/lint1/msg_116.c b/usr.bin/xlint/lint1/msg_116.c
index d591c6429d35..4e9997f5ea30 100644
--- a/usr.bin/xlint/lint1/msg_116.c
+++ b/usr.bin/xlint/lint1/msg_116.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_116.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_116.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_116.c"
-// Test for message: illegal pointer subtraction [116]
+// Test for message: invalid pointer subtraction [116]
/* lint1-extra-flags: -X 351 */
@@ -14,7 +14,7 @@
_Bool
example(int *a, double *b)
{
- /* expect+1: error: illegal pointer subtraction [116] */
+ /* expect+1: error: invalid pointer subtraction [116] */
return a - b > 0;
}
@@ -27,7 +27,7 @@ example(int *a, double *b)
_Bool
subtract_character_pointers(signed char *scp, unsigned char *ucp)
{
- /* expect+1: error: illegal pointer subtraction [116] */
+ /* expect+1: error: invalid pointer subtraction [116] */
return scp - ucp > 0;
}
diff --git a/usr.bin/xlint/lint1/msg_117.c b/usr.bin/xlint/lint1/msg_117.c
index c6353adce237..67da1c3394a2 100644
--- a/usr.bin/xlint/lint1/msg_117.c
+++ b/usr.bin/xlint/lint1/msg_117.c
@@ -1,14 +1,72 @@
-/* $NetBSD: msg_117.c,v 1.14 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_117.c,v 1.16 2025/09/14 14:42:52 rillig Exp $ */
# 3 "msg_117.c"
-// Test for message: bitwise '%s' on signed value possibly nonportable [117]
+// Test for message: bitwise '%s' on signed '%s' possibly nonportable [117]
/* lint1-extra-flags: -p -X 351 */
+signed char s8;
+unsigned char u8;
+short s16;
+unsigned short u16;
+int s32;
+unsigned u32;
+long long s64;
+unsigned long long u64;
+
+// Shifting a signed integer left invokes undefined behavior if a 1 is shifted
+// to the sign bit or beyond. At runtime, KUBSAN performs this check.
+void
+shl(void)
+{
+ s32 = s8 << 0;
+ s32 = s8 << 23;
+ /* expect+1: warning: bitwise '<<' on signed 'int promoted from signed char' possibly nonportable [117] */
+ s32 = s8 << 24;
+ s32 = s8 << 31;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int promoted from signed char' [267] */
+ s32 = s8 << 32;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int promoted from signed char' [267] */
+ s64 = s8 << 32;
+
+ /*
+ * When shifting 'uint8_t', it first gets promoted to 'int', which is
+ * then subject to the overflow check. To prevent this, first cast the
+ * 'uint8_t' to a suitable larger unsigned integer type.
+ */
+ u32 = u8 << 0;
+ u32 = u8 << 23;
+ /* expect+1: warning: bitwise '<<' on signed 'int promoted from unsigned char' possibly nonportable [117] */
+ u32 = u8 << 24;
+ u32 = u8 << 31;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int promoted from unsigned char' [267] */
+ u32 = u8 << 32;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int promoted from unsigned char' [267] */
+ u64 = u8 << 32;
+
+ u32 = s32 << 0;
+ u32 = s32 << 23;
+ u32 = s32 << 24;
+ u32 = s32 << 31;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int' [267] */
+ u32 = s32 << 32;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int' [267] */
+ u64 = s32 << 32;
+
+ u32 = u32 << 0;
+ u32 = u32 << 23;
+ u32 = u32 << 24;
+ u32 = u32 << 31;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */
+ u32 = u32 << 32;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */
+ u64 = u32 << 32;
+}
+
int
shr(int a, int b)
{
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
return a >> b;
}
@@ -21,14 +79,14 @@ shr_lhs_constant_positive(int a)
int
shr_lhs_constant_negative(int a)
{
- /* expect+1: warning: bitwise '>>' on signed value nonportable [120] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' nonportable [120] */
return -0x1234 >> a;
}
int
shr_rhs_constant_positive(int a)
{
- /* expect+2: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+2: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
/* expect+1: warning: shift amount 4660 is greater than bit-size 32 of 'int' [122] */
return a >> 0x1234;
}
@@ -36,7 +94,7 @@ shr_rhs_constant_positive(int a)
int
shr_rhs_constant_negative(int a)
{
- /* expect+2: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+2: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
/* expect+1: warning: negative shift [121] */
return a >> -0x1234;
}
@@ -59,7 +117,7 @@ shr_unsigned_char_promoted_signed(unsigned char bit)
* The possible values for 'bit' range from 0 to 255. Subtracting 1
* from 0 results in a negative expression value.
*/
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
return (unsigned char)((bit - 1) >> 5);
}
@@ -102,7 +160,7 @@ shr_signed_ignoring_high_bits(int x)
* All sane platforms should define that 'x >> 0 == x', even if x is
* negative.
*/
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
if (x >> 0 != 0)
return;
@@ -110,7 +168,7 @@ shr_signed_ignoring_high_bits(int x)
* If x is negative, x >> 1 is nonzero, no matter whether the shift
* is arithmetic or logical.
*/
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
if (x >> 1 != 0)
return;
@@ -119,7 +177,7 @@ shr_signed_ignoring_high_bits(int x)
* on all sane platforms, making it irrelevant whether the actual
* shift operation is arithmetic or logical.
*/
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
if (((x >> 1) & 1) != 0)
return;
@@ -127,7 +185,7 @@ shr_signed_ignoring_high_bits(int x)
* The result of this expression is the same with arithmetic and
* logical shifts since the filled bits are masked out.
*/
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
if (((x >> 31) & 1) != 0)
return;
@@ -135,7 +193,7 @@ shr_signed_ignoring_high_bits(int x)
* In this case, arithmetic shift results in 2 while logical shift
* results in 0. This difference is what this warning is about.
*/
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
if (((x >> 31) & 2) != 0)
return;
diff --git a/usr.bin/xlint/lint1/msg_118.c b/usr.bin/xlint/lint1/msg_118.c
index b31d9b6edfd2..288e04321078 100644
--- a/usr.bin/xlint/lint1/msg_118.c
+++ b/usr.bin/xlint/lint1/msg_118.c
@@ -1,39 +1,47 @@
-/* $NetBSD: msg_118.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_118.c,v 1.9 2025/09/06 20:18:41 rillig Exp $ */
# 3 "msg_118.c"
-/* Test for message: semantics of '%s' change in ANSI C; use explicit cast [118] */
+/* Test for message: '%s' %s '%s' differs between traditional C and C90 [118] */
/* lint1-flags: -hw -X 351 */
+/* lint1-only-if: lp64 */
-int
-int_shl_uint(int left, unsigned int right)
-{
- return left << right;
-}
+int si;
+unsigned ui;
+long sl;
+unsigned long ul;
-int
-int_shr_uint(int left, unsigned int right)
+void
+test_shl(void)
{
- /* expect+1: warning: semantics of '>>' change in ANSI C; use explicit cast [118] */
- return left >> right;
+ si <<= si;
+ si <<= ui;
+ /* expect+1: warning: 'int' <<= 'long' differs between traditional C and C90 [118] */
+ si <<= sl;
+ /* expect+1: warning: 'int' <<= 'unsigned long' differs between traditional C and C90 [118] */
+ si <<= ul;
+
+ si = si << si;
+ si = si << ui;
+ /* expect+1: warning: 'int' << 'long' differs between traditional C and C90 [118] */
+ si = si << sl;
+ /* expect+1: warning: 'int' << 'unsigned long' differs between traditional C and C90 [118] */
+ si = si << ul;
}
-int
-int_shl_int(int left, int right)
+void
+test_shr(void)
{
- return left << right;
-}
+ si >>= si;
+ si >>= ui;
+ si >>= sl;
+ si >>= ul;
-/*
- * The behavior of typeok_shl can only be triggered on 64-bit platforms, or
- * in C99 mode, and the above tests require C90 mode.
- *
- * On 32-bit platforms both operands of the '<<' operator are first promoted
- * individually, and since C90 does not know 'long long', the maximum
- * bit-size for an integer type is 32 bits.
- *
- * Because of this difference there is no test for that case since as of
- * 2021-05-04, all lint1 tests must be independent of the target platform and
- * there is no way to toggle individual tests depending on the properties of
- * the target platform.
- */
+ si = si >> si;
+ /* expect+1: warning: 'int' >> 'unsigned int' differs between traditional C and C90 [118] */
+ si = si >> ui;
+ /* expect+1: warning: 'int' >> 'long' differs between traditional C and C90 [118] */
+ si = si >> sl;
+ /* expect+1: warning: 'int' >> 'unsigned long' differs between traditional C and C90 [118] */
+ si = si >> ul;
+}
diff --git a/usr.bin/xlint/lint1/msg_120.c b/usr.bin/xlint/lint1/msg_120.c
index 6ab435b147d5..a28ff2d73c89 100644
--- a/usr.bin/xlint/lint1/msg_120.c
+++ b/usr.bin/xlint/lint1/msg_120.c
@@ -1,14 +1,14 @@
-/* $NetBSD: msg_120.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_120.c,v 1.8 2025/09/14 11:14:00 rillig Exp $ */
# 3 "msg_120.c"
-// Test for message: bitwise '%s' on signed value nonportable [120]
+// Test for message: bitwise '%s' on signed '%s' nonportable [120]
/* lint1-extra-flags: -p -X 351 */
int
shr(int a, int b)
{
- /* expect+1: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
return a >> b;
}
@@ -21,14 +21,14 @@ shr_lhs_constant_positive(int a)
int
shr_lhs_constant_negative(int a)
{
- /* expect+1: warning: bitwise '>>' on signed value nonportable [120] */
+ /* expect+1: warning: bitwise '>>' on signed 'int' nonportable [120] */
return -0x1234 >> a;
}
int
shr_rhs_constant_positive(int a)
{
- /* expect+2: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+2: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
/* expect+1: warning: shift amount 4660 is greater than bit-size 32 of 'int' [122] */
return a >> 0x1234;
}
@@ -36,7 +36,7 @@ shr_rhs_constant_positive(int a)
int
shr_rhs_constant_negative(int a)
{
- /* expect+2: warning: bitwise '>>' on signed value possibly nonportable [117] */
+ /* expect+2: warning: bitwise '>>' on signed 'int' possibly nonportable [117] */
/* expect+1: warning: negative shift [121] */
return a >> -0x1234;
}
diff --git a/usr.bin/xlint/lint1/msg_123.c b/usr.bin/xlint/lint1/msg_123.c
index 0849e0fca981..2945381eee02 100644
--- a/usr.bin/xlint/lint1/msg_123.c
+++ b/usr.bin/xlint/lint1/msg_123.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_123.c,v 1.8 2023/06/03 20:28:54 rillig Exp $ */
+/* $NetBSD: msg_123.c,v 1.9 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_123.c"
-// Test for message: illegal combination of %s '%s' and %s '%s', op '%s' [123]
+// Test for message: invalid combination of %s '%s' and %s '%s', op '%s' [123]
/* lint1-extra-flags: -X 351 */
@@ -14,21 +14,21 @@ compare(_Bool b, int i, double d, const char *p)
ok(b < b);
ok(b < i);
ok(b < d);
- /* expect+1: warning: illegal combination of integer '_Bool' and pointer 'pointer to const char', op '<' [123] */
+ /* expect+1: warning: invalid combination of integer '_Bool' and pointer 'pointer to const char', op '<' [123] */
bad(b < p);
ok(i < b);
ok(i < i);
ok(i < d);
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to const char', op '<' [123] */
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to const char', op '<' [123] */
bad(i < p);
ok(d < b);
ok(d < i);
ok(d < d);
/* expect+1: error: operands of '<' have incompatible types 'double' and 'pointer to const char' [107] */
bad(d < p);
- /* expect+1: warning: illegal combination of pointer 'pointer to const char' and integer '_Bool', op '<' [123] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to const char' and integer '_Bool', op '<' [123] */
bad(p < b);
- /* expect+1: warning: illegal combination of pointer 'pointer to const char' and integer 'int', op '<' [123] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to const char' and integer 'int', op '<' [123] */
bad(p < i);
/* expect+1: error: operands of '<' have incompatible types 'pointer to const char' and 'double' [107] */
bad(p < d);
@@ -38,8 +38,8 @@ compare(_Bool b, int i, double d, const char *p)
void
cover_check_assign_types_compatible(int *int_pointer, int i)
{
- /* expect+1: warning: illegal combination of pointer 'pointer to int' and integer 'int', op '=' [123] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to int' and integer 'int', op '=' [123] */
int_pointer = i;
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to int', op '=' [123] */
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to int', op '=' [123] */
i = int_pointer;
}
diff --git a/usr.bin/xlint/lint1/msg_124.c b/usr.bin/xlint/lint1/msg_124.c
index 0a73db62fb43..5bfc7c2fad2b 100644
--- a/usr.bin/xlint/lint1/msg_124.c
+++ b/usr.bin/xlint/lint1/msg_124.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_124.c,v 1.14 2023/07/07 06:03:31 rillig Exp $ */
+/* $NetBSD: msg_124.c,v 1.16 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_124.c"
-// Test for message: illegal combination of '%s' and '%s', op '%s' [124]
+// Test for message: invalid combination of '%s' and '%s', op '%s' [124]
/* lint1-extra-flags: -s -X 191,351 */
@@ -15,11 +15,11 @@ typedef int(*printflike)(const char *, ...)
void
example(int *ptr)
{
- /* expect+1: warning: illegal combination of 'pointer to function(int) returning void' and 'pointer to int', op 'init' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to function(int) returning void' and 'pointer to int', op 'init' [124] */
signal_handler handler = ptr;
- /* expect+1: warning: illegal combination of 'pointer to function(pointer to function(int) returning void) returning pointer to function(int) returning void' and 'pointer to int', op 'init' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to function(pointer to function(int) returning void) returning pointer to function(int) returning void' and 'pointer to int', op 'init' [124] */
sys_signal signal = ptr;
- /* expect+1: warning: illegal combination of 'pointer to function(pointer to const char, ...) returning int' and 'pointer to int', op 'init' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to function(pointer to const char, ...) returning int' and 'pointer to int', op 'init' [124] */
printflike printf = ptr;
}
@@ -32,11 +32,11 @@ compare_pointers(const void *vp, const char *cp, const int *ip,
{
ok(vp == cp);
ok(vp == ip);
- /* expect+1: warning: ANSI C forbids comparison of 'void *' with function pointer [274] */
+ /* expect+1: warning: C90 or later forbid comparison of 'void *' with function pointer [274] */
ok(vp == fp);
- /* expect+1: warning: illegal combination of 'pointer to const char' and 'pointer to const int', op '==' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to const char' and 'pointer to const int', op '==' [124] */
not_ok(cp == ip);
- /* expect+1: warning: illegal combination of 'pointer to const char' and 'pointer to function(int) returning void', op '==' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to const char' and 'pointer to function(int) returning void', op '==' [124] */
not_ok(cp == fp);
ok(vp == (void *)0);
ok(cp == (void *)0);
diff --git a/usr.bin/xlint/lint1/msg_125.c b/usr.bin/xlint/lint1/msg_125.c
index 4570a7981e10..86bfac446ce7 100644
--- a/usr.bin/xlint/lint1/msg_125.c
+++ b/usr.bin/xlint/lint1/msg_125.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_125.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_125.c,v 1.6 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_125.c"
-// Test for message: ANSI C forbids ordered comparisons of pointers to functions [125]
+// Test for message: pointers to functions can only be compared for equality [125]
/* lint1-extra-flags: -s -X 351 */
@@ -10,6 +10,6 @@ typedef void (*action)(void);
int
less(action a, action b)
{
- /* expect+1: warning: ANSI C forbids ordered comparisons of pointers to functions [125] */
+ /* expect+1: warning: pointers to functions can only be compared for equality [125] */
return a < b;
}
diff --git a/usr.bin/xlint/lint1/msg_126.c b/usr.bin/xlint/lint1/msg_126.c
index 1685669cef5b..ab8b6609010e 100644
--- a/usr.bin/xlint/lint1/msg_126.c
+++ b/usr.bin/xlint/lint1/msg_126.c
@@ -1,15 +1,27 @@
-/* $NetBSD: msg_126.c,v 1.8 2023/08/06 19:44:50 rillig Exp $ */
+/* $NetBSD: msg_126.c,v 1.9 2024/12/09 22:43:33 rillig Exp $ */
# 3 "msg_126.c"
// Test for message: incompatible types '%s' and '%s' in conditional [126]
-/* lint1-extra-flags: -X 351 */
+/* lint1-extra-flags: -X 351 -q 1 */
/* ARGSUSED */
-int
-max(int cond, void *ptr, double dbl)
+void
+example(int i, void *ptr, double dbl, void (*return_void)(void))
{
- /* expect+2: error: incompatible types 'pointer to void' and 'double' in conditional [126] */
- /* expect+1: error: function 'max' expects to return value [214] */
- return cond ? ptr : dbl;
+ /* expect+1: error: incompatible types 'pointer to void' and 'double' in conditional [126] */
+ i = i > 0 ? ptr : dbl;
+
+ ptr = i > 0 ? ptr : (void *)0;
+
+ ptr = i > 0 ? ptr : 0;
+
+ /* expect+1: implicit conversion from floating point 'double' to integer 'int' [Q1] */
+ i = i > 0 ? dbl : i;
+
+ // GCC accepts the 'int/void' mismatch even with -Wall -Wextra -std=c99.
+ /* expect+1: warning: incompatible types 'void' and 'int' in conditional [126] */
+ i > 0 ? return_void() : 0;
+
+ i > 0 ? return_void() : (void)0;
}
diff --git a/usr.bin/xlint/lint1/msg_127.c b/usr.bin/xlint/lint1/msg_127.c
index 975a78a1958c..d9cd54cbd161 100644
--- a/usr.bin/xlint/lint1/msg_127.c
+++ b/usr.bin/xlint/lint1/msg_127.c
@@ -1,14 +1,18 @@
-/* $NetBSD: msg_127.c,v 1.4 2022/06/16 16:58:36 rillig Exp $ */
+/* $NetBSD: msg_127.c,v 1.6 2025/03/10 22:35:02 rillig Exp $ */
# 3 "msg_127.c"
/* Test for message: '&' before array or function: ignored [127] */
+/* This message is not used. */
+/*
+ * This message contradicts all C standards and is not mentioned in K&R 1978
+ * either.
+ */
/* lint1-extra-flags: -t */
void
example()
{
- /* expect+1: warning: '&' before array or function: ignored [127] */
if (&example != (void *)0)
return;
}
diff --git a/usr.bin/xlint/lint1/msg_128.c b/usr.bin/xlint/lint1/msg_128.c
index 3e9f90ab18eb..3720b96e324e 100644
--- a/usr.bin/xlint/lint1/msg_128.c
+++ b/usr.bin/xlint/lint1/msg_128.c
@@ -1,15 +1,31 @@
-/* $NetBSD: msg_128.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_128.c,v 1.10 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_128.c"
-// Test for message: operands of '%s' have incompatible pointer types to '%s' and '%s' [128]
+// Test for message: operator '%s' discards '%s' from '%s' [128]
/* lint1-extra-flags: -X 351 */
+char *ptr;
+const char *cptr;
+volatile char *vptr;
+const volatile char *cvptr;
+
+const volatile int *cviptr;
+
void
-conversion_to_unconst(const char *cstr)
+assign(void)
{
- char *str;
- /* expect+2: warning: 'str' set but not used in function 'conversion_to_unconst' [191] */
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'const char' [128] */
- str = cstr;
+ /* expect+1: warning: operator '=' discards 'const volatile' from 'pointer to const volatile char' [128] */
+ ptr = cvptr;
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to const volatile char' [128] */
+ cptr = cvptr;
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const volatile char' [128] */
+ vptr = cvptr;
+
+ /* expect+1: warning: invalid combination of 'pointer to char' and 'pointer to const volatile int', op '=' [124] */
+ ptr = cviptr;
+ /* expect+1: warning: invalid combination of 'pointer to const char' and 'pointer to const volatile int', op '=' [124] */
+ cptr = cviptr;
+ /* expect+1: warning: invalid combination of 'pointer to volatile char' and 'pointer to const volatile int', op '=' [124] */
+ vptr = cviptr;
}
diff --git a/usr.bin/xlint/lint1/msg_129.c b/usr.bin/xlint/lint1/msg_129.c
index 763d1b854114..b1e04bcd5d82 100644
--- a/usr.bin/xlint/lint1/msg_129.c
+++ b/usr.bin/xlint/lint1/msg_129.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_129.c,v 1.8 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: msg_129.c,v 1.11 2025/09/17 19:25:23 rillig Exp $ */
# 3 "msg_129.c"
// Test for message: expression has null effect [129]
@@ -31,6 +31,71 @@ uint8_buffer_write_uint32(uint8_t *c, uint32_t l)
}
void
+operator_and(_Bool cond)
+{
+ cond && side_effect();
+ // ... is an abbreviation for ...
+ if (cond)
+ side_effect();
+ // This pattern is much more common in shell or Perl than in C.
+
+ /* expect+1: warning: expression has null effect [129] */
+ side_effect() && cond;
+}
+
+void
+operator_or(_Bool cond)
+{
+ cond || side_effect();
+ // ... is an abbreviation for ...
+ if (!cond)
+ side_effect();
+ // This pattern is much more common in shell or Perl than in C.
+
+ /* expect+1: warning: expression has null effect [129] */
+ side_effect() || cond;
+}
+
+void
+operator_quest_colon(void)
+{
+ side_effect() ? side_effect() : side_effect();
+
+ /* expect+1: warning: expression has null effect [129] */
+ side_effect() ? side_effect() : 0;
+
+ /* expect+1: warning: expression has null effect [129] */
+ side_effect() ? 0 : side_effect();
+
+ /* expect+1: warning: expression has null effect [129] */
+ side_effect() ? 0 : 1;
+
+ 0 ? side_effect() : side_effect();
+
+ /* expect+1: warning: expression has null effect [129] */
+ 0 ? side_effect() : 0;
+
+ /* expect+1: warning: expression has null effect [129] */
+ 0 ? 0 : side_effect();
+
+ /* expect+1: warning: expression has null effect [129] */
+ 0 ? 0 : 1;
+
+ 1 ? side_effect() : side_effect();
+
+ /* expect+1: warning: expression has null effect [129] */
+ 1 ? side_effect() : 0;
+
+ /* expect+1: warning: expression has null effect [129] */
+ 1 ? 0 : side_effect();
+
+ /* expect+1: warning: expression has null effect [129] */
+ 1 ? 1 : 0;
+
+ 0 ? (void)1 : (void)0;
+}
+
+void
operator_comma(void)
{
side_effect(), 0; /* the 0 is redundant */
@@ -64,7 +129,7 @@ legitimate_use_cases(int arg)
*/
(void)local;
- /* This is a short-hand notation for a do-nothing command. */
+ /* This is a shorthand notation for a do-nothing command. */
(void)0;
/*
@@ -78,7 +143,8 @@ legitimate_use_cases(int arg)
/*
* This variant of the do-nothing command is commonly used in
* preprocessor macros since it works nicely with if-else and if-then
- * statements. It is longer than the above variant though.
+ * statements. It is longer than the above variant, and it is not
+ * embeddable into an expression.
*/
do {
} while (0);
@@ -94,3 +160,31 @@ legitimate_use_cases(int arg)
/* expect+1: warning: expression has null effect [129] */
(void)(void)0;
}
+
+int
+return_statement_expression(int arg)
+{
+ ({
+ int local = arg;
+ local + 4;
+ /* expect+1: warning: expression has null effect [129] */
+ });
+
+ if (arg == 1)
+ return ({
+ int local = arg;
+ // Before cgram.y 1.513 from 2024-10-29, lint wrongly
+ // warned that this expression would have a null effect.
+ local;
+ });
+
+ if (arg == 2)
+ return ({
+ int local = arg;
+ // Before cgram.y 1.513 from 2024-10-29, lint wrongly
+ // warned that this expression would have a null effect.
+ local + 4;
+ });
+
+ return 0;
+}
diff --git a/usr.bin/xlint/lint1/msg_130.c b/usr.bin/xlint/lint1/msg_130.c
index 078e033f73b6..f354ca747fcc 100644
--- a/usr.bin/xlint/lint1/msg_130.c
+++ b/usr.bin/xlint/lint1/msg_130.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_130.c,v 1.16 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_130.c,v 1.17 2024/11/13 04:32:49 rillig Exp $ */
# 3 "msg_130.c"
// Test for message: enum type mismatch: '%s' '%s' '%s' [130]
@@ -95,7 +95,7 @@ enum_constant_from_unnamed_type(int x)
if (sizeof_int == sizeof_uint)
return 6;
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'return' statement not reached [193] */
return 0;
}
diff --git a/usr.bin/xlint/lint1/msg_132.c b/usr.bin/xlint/lint1/msg_132.c
index f7aa33040a93..78d5a3362ef0 100644
--- a/usr.bin/xlint/lint1/msg_132.c
+++ b/usr.bin/xlint/lint1/msg_132.c
@@ -1,10 +1,8 @@
-/* $NetBSD: msg_132.c,v 1.32 2023/08/06 19:44:50 rillig Exp $ */
+/* $NetBSD: msg_132.c,v 1.58 2026/01/17 16:22:35 rillig Exp $ */
# 3 "msg_132.c"
// Test for message: conversion from '%s' to '%s' may lose accuracy [132]
-/* lint1-extra-flags: -X 351 */
-
/*
* NetBSD's default lint flags only include a single -a, which only flags
* narrowing conversions from long. To get warnings for all narrowing
@@ -13,7 +11,7 @@
* https://gnats.netbsd.org/14531
*/
-/* lint1-extra-flags: -aa */
+/* lint1-extra-flags: -aa -X 351 */
typedef unsigned char u8_t;
typedef unsigned short u16_t;
@@ -23,6 +21,7 @@ typedef signed char s8_t;
typedef signed short s16_t;
typedef signed int s32_t;
typedef signed long long s64_t;
+typedef typeof(sizeof(0)) size_t;
_Bool cond;
char ch;
@@ -37,6 +36,8 @@ s16_t s16;
s32_t s32;
s64_t s64;
+const char *ptr;
+
struct bit_fields {
unsigned u1:1;
unsigned u2:2;
@@ -174,9 +175,9 @@ to_bool(long a, long b)
const char *
cover_build_plus_minus(const char *arr, double idx)
{
- /* expect+3: error: operands of '+' have incompatible types 'pointer to const char' and 'double' [107] */
- /* expect+2: error: function 'cover_build_plus_minus' expects to return value [214] */
if (idx > 0.0)
+ /* expect+2: error: operands of '+' have incompatible types 'pointer to const char' and 'double' [107] */
+ /* expect+1: error: function 'cover_build_plus_minus' expects to return value [214] */
return arr + idx;
return arr + (unsigned int)idx;
}
@@ -206,105 +207,99 @@ non_constant_expression(void)
* Since tree.c 1.444 from 2022-05-26, lint tracks simple bitwise and
* arithmetic constraints across a single expression.
*/
-static inline u16_t
-be16dec(const void *buf)
+void
+be16dec(void)
{
- const u8_t *p = buf;
-
/*
* Before tree.c 1.444 from 2022-05-26, lint complained that the
* conversion from 'int' to 'unsigned short' may lose accuracy.
*/
- return ((u16_t)p[0]) << 8 | p[1];
+ u16 = (u16_t)u8 << 8 | u8;
}
/*
* Since tree.c 1.434 from 2022-04-19, lint infers the possible values of
* expressions of the form 'integer & constant', see can_represent.
*/
-static inline void
-be32enc(void *buf, u32_t u)
+void
+be32enc(void)
{
- u8_t *p = buf;
-
- p[0] = u >> 24 & 0xff;
- p[1] = u >> 16 & 0xff;
- p[2] = u >> 8 & 0xff;
- p[3] = u & 0xff;
+ u8 = u32 >> 24 & 0xff;
+ u8 = u32 >> 16 & 0xff;
+ u8 = u32 >> 8 & 0xff;
+ u8 = u32 & 0xff;
}
-u32_t
-test_ic_shr(u64_t x)
+void
+test_ic_mult(void)
{
- if (x > 3)
- return x >> 32;
- if (x > 2)
- /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
- return x >> 31;
-
- /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
- u32 = u64 >> 31;
- u32 = u64 >> 32;
- u16 = u64 >> 48;
- u8 = u64 >> 56;
- u16 = u32 >> 16;
- u8 = u32 >> 24;
- u8 = u16 >> 8;
-
- /*
- * No matter whether the big integer is signed or unsigned, the
- * result of '&' is guaranteed to be an unsigned value.
- */
- u8 = (s64 & 0xf0) >> 4;
- u8 = (s8 & 0xf0) >> 4;
+ /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
+ u8 = u8 * u8;
+ u16 = u8 * u8;
+ /* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
+ u16 = u16 * u8;
+ u32 = u16 * u16;
+ u32 = u16 * 65537ULL;
/* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
- return x;
-}
+ u32 = u16 * 65538ULL;
-unsigned char
-test_bit_fields(unsigned long long m)
-{
- /* expect+1: warning: conversion from 'unsigned long long:32' to 'unsigned int:3' may lose accuracy [132] */
- bits.u3 = bits.u32 & m;
+ u16 = 0 * u16;
+ u16 = 1 * u16;
+ /* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
+ u16 = 2 * u16;
- bits.u5 = bits.u3 & m;
- bits.u32 = bits.u5 & m;
+ // from __BITS, __SHIFTIN, __SHIFTOUT
+ u32 = (u16 & 1023ULL) / 1ULL * 1024ULL | (u16 & 1023ULL) / 1ULL * 1ULL;
- /* expect+1: warning: conversion from 'unsigned long long:32' to 'unsigned char' may lose accuracy [132] */
- return bits.u32 & m;
-}
+ s8 = 1 * s8;
+ s16 = 1 * s16;
+ s32 = 1 * s32;
+ s64 = 1 * s64;
-/*
- * Traditional C has an extra rule that the right-hand operand of a bit shift
- * operator is converted to 'int'. Before tree.c 1.467 from 2022-07-02, this
- * conversion was implemented as a CVT node, which means a cast, not an
- * implicit conversion. Changing the CVT to NOOP would have caused a wrong
- * warning 'may lose accuracy' in language levels other than traditional C.
- */
+ /* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
+ s8 = 2 * s8;
+ /* expect+1: warning: conversion from 'int' to 'short' may lose accuracy [132] */
+ s16 = 2 * s16;
+ // No warning, as there is no narrowing conversion.
+ s32 = 2 * s32;
+ // No warning, as there is no narrowing conversion.
+ s64 = 2 * s64;
-u64_t
-u64_shl(u64_t lhs, u64_t rhs)
-{
- return lhs << rhs;
+ /* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
+ s8 = -1 * s8;
+ /* expect+1: warning: conversion from 'int' to 'short' may lose accuracy [132] */
+ s16 = -1 * s16;
+ // No warning, as there is no narrowing conversion.
+ s32 = -1 * s32;
+ // No warning, as there is no narrowing conversion.
+ s64 = -1 * s64;
}
-u64_t
-u64_shr(u64_t lhs, u64_t rhs)
+void
+test_ic_div(void)
{
- return lhs >> rhs;
-}
+ u8 = u8 / u8;
+ /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
+ u8 = u16 / u8;
+ u16 = u8 / u8;
+ u16 = u32 / 65536;
+ /* expect+1: warning: conversion from 'unsigned int' to 'unsigned short' may lose accuracy [132] */
+ u16 = u32 / 65535;
-s64_t
-s64_shl(s64_t lhs, s64_t rhs)
-{
- return lhs << rhs;
-}
+ s8 = s8 / 1;
+ s16 = s16 / 1;
+ s32 = s32 / 1;
+ s64 = s64 / 1;
-s64_t
-s64_shr(s64_t lhs, s64_t rhs)
-{
- return lhs >> rhs;
+ /* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
+ s8 = s8 / -1;
+ /* expect+1: warning: conversion from 'int' to 'short' may lose accuracy [132] */
+ s16 = s16 / -1;
+ // No warning, as there is no narrowing conversion.
+ s32 = s32 / -1;
+ // No warning, as there is no narrowing conversion.
+ s64 = s64 / -1;
}
void
@@ -328,40 +323,166 @@ test_ic_mod(void)
bits.u10 = u64 % 1000;
u16 = u64 % 1000;
- /*
- * For signed division, if the result of 'a / b' is not representable
- * exactly, the result of 'a % b' is defined such that
- * '(a / b) * a + a % b == a'.
- *
- * If the result of 'a / b' is not representable exactly, the result
- * of 'a % b' is not defined. Due to this uncertainty, lint does not
- * narrow down the range for signed modulo expressions.
- *
- * C90 6.3.5, C99 6.5.5.
- */
-
- /* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
s8 = s16 % s8;
+ /* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
+ s8 = s16 % s16;
+ s8 = s64 % 1;
+ s8 = s64 % (s16 & 1);
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = s64 % (s16 & 0);
+ s8 = (s64 & 0x7f) % s64;
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = (s64 & 0xff) % s64;
+}
- /*
- * The result is always 0, it's a theoretical edge case though, so
- * lint doesn't care to implement this.
- */
+void
+test_ic_plus(void)
+{
/* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
- s8 = s64 % 1;
+ s8 = -129 + s64 % 1;
+ s8 = -128 + s64 % 1;
+ s8 = 127 + s64 % 1;
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = 128 + s64 % 1;
+
+ /* expect+2: warning: conversion of negative constant -129 to unsigned type 'unsigned long long' [222] */
+ /* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
+ s8 = -129 + u64 % 1;
+ /* expect+2: warning: conversion of negative constant -128 to unsigned type 'unsigned long long' [222] */
+ /* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
+ s8 = -128 + u64 % 1;
+ s8 = 127 + u64 % 1;
+ /* expect+1: warning: conversion from 'unsigned long long' to 'signed char' may lose accuracy [132] */
+ s8 = 128 + u64 % 1;
+
+ u8 = 0 + u64 % 1;
+ u8 = 255 + u64 % 1;
+ /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
+ u8 = 256 + u64 % 1;
+
+ u8 = s8 + 0x80;
+ u16 = s16 + 0x8000;
+ u32 = s32 + 0x80000000;
+ u64 = s64 + 0x8000000000000000;
+
+ // XXX: No warnings since portable_rank_cmp is the same for both sides.
+ bits.u11 = bits.u10 + bits.u10 + 1;
+ bits.u11 = bits.u10 + bits.u10 + 2;
+ bits.u11 = bits.u10 + 1024;
+ bits.u11 = bits.u10 + 1025;
+
+ u8 = bits.u7 + bits.u7 + 1;
+ /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
+ u8 = bits.u7 + bits.u7 + 2;
+ u8 = bits.u7 + 128;
+ /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
+ u8 = bits.u7 + 129;
+
+ // The result of the second '+' wraps around, thus the warning,
+ // even though the final result fits in a u16.
+ /* expect+1: warning: conversion from 'unsigned int' to 'unsigned short' may lose accuracy [132] */
+ u16 = u32 % 0x00010000 + 0x80000000 + 0x80000000;
+
+ /* expect+1: warning: conversion from 'unsigned int' to 'unsigned short' may lose accuracy [132] */
+ u16 = u32 % 0x00010000 + 0xffff8000;
+ /* expect+1: warning: conversion from 'unsigned int' to 'short' may lose accuracy [132] */
+ s16 = u32 % 0x00010000 + 0xffff8000;
+
+ /* expect+1: warning: conversion from 'long long' to 'unsigned short' may lose accuracy [132] */
+ u16 = s64 % 0x00010000 + 0xffffffffLL + -0xffffffffLL;
+ /* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
+ u16 = s32 % 0x00010000 + 0x7fff0000 + -0x7fff0000;
+ /* expect+1: warning: conversion from 'unsigned int' to 'unsigned short' may lose accuracy [132] */
+ u16 = u32 % 0x00010000 + 0xffff0000 + 0x00010000;
+
+ s8 = '0' + s64 % 10;
+
+ ptr = ptr + 3;
}
void
-test_ic_bitand(void)
+test_ic_minus(void)
{
+ // Shift the range [0x00 to 0xff] to [-0x80 to 0x7f].
+ s8 = (s64 & 0xff) - 0x80;
+
+ // Sign-extend the lowest bits.
+ s8 = ((s64 & 0xff) ^ 0x80) - 0x80;
+ s16 = ((s64 & 0xffff) ^ 0x8000) - 0x8000;
+ /* expect+1: warning: '&' converts 'unsigned int' with its most significant bit being set to 'long long' [309] */
+ s32 = ((s64 & 0xffffffff) ^ 0x80000000) - 0x80000000;
+
+ // Trying to sign-extend, but with off-by-one errors.
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = ((s64 & 0xff) ^ 0x80) - 0x7f;
+ /* expect+1: warning: conversion from 'long long' to 'signed char' may lose accuracy [132] */
+ s8 = ((s64 & 0xff) ^ 0x80) - 0x81;
+
+ u8 = s8 - -0x80;
+ u16 = s16 - -0x8000;
+ u32 = s32 - -0x80000000;
+ u64 = s64 - -0x8000000000000000;
+
+ ptr = ptr - 3;
+ s64 = ptr + 3 - ptr;
+}
+
+void
+test_ic_shl(void)
+{
+ u64 = u64 << u64;
+ s64 = s64 << s64;
+
+ u16 = u8 << 8;
+ /* expect+1: warning: conversion from 'int' to 'unsigned short' may lose accuracy [132] */
+ u16 = u8 << 9;
+ /* expect+1: warning: bitwise '<<' on signed 'int promoted from unsigned short' possibly nonportable [117] */
+ u32 = u16 << 16;
+ // XXX: missing warning as UINT has the same rank as INT, see portable_rank_cmp.
+ u32 = u16 << 17;
+ /* expect+1: warning: shift amount 56 is greater than bit-size 32 of 'int promoted from unsigned char' [122] */
+ u64 = u8 << 56;
+ u64 = (u64_t)u8 << 56;
+ // XXX: missing warning, as the operand types of '=' are the same, thus no conversion.
+ u64 = (u64_t)u8 << 57;
+ /* expect+1: warning: shift amount 48 is greater than bit-size 32 of 'int promoted from unsigned short' [122] */
+ u64 = u16 << 48;
+ u64 = (u64_t)u16 << 48;
+ // XXX: missing warning, as the operand types of '=' are the same, thus no conversion.
+ u64 = (u64_t)u16 << 49;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */
+ u64 = u32 << 32;
+ u64 = (u64_t)u32 << 32;
+ // XXX: missing warning, as the operand types of '=' are the same, thus no conversion.
+ u64 = (u64_t)u32 << 33;
+}
+
+void
+test_ic_shr(void)
+{
+ u64 = u64 >> u64;
+ s64 = s64 >> s64;
+
+ u32 = u64 >> 32;
+ /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
+ u32 = u64 >> 31;
+ u16 = u64 >> 48;
+ u16 = u32 >> 16;
+ u8 = u64 >> 56;
+ u8 = u32 >> 24;
+ u8 = u16 >> 8;
+
/*
- * ic_bitand assumes that integers are represented in 2's complement,
- * and that the sign bit of signed integers behaves like a value bit.
- * That way, the following expressions get their constraints computed
- * correctly, regardless of whether ic_expr takes care of integer
- * promotions or not. Compare ic_mod, which ignores signed types.
+ * No matter whether the big integer is signed or unsigned, the
+ * result of '&' is guaranteed to be an unsigned value.
*/
+ u8 = (s64 & 0xf0) >> 4;
+ u8 = (s8 & 0xf0) >> 4;
+}
+void
+test_ic_bitand(void)
+{
u8 = u8 & u16;
/* expect+1: warning: conversion from 'unsigned int' to 'unsigned char' may lose accuracy [132] */
@@ -369,14 +490,35 @@ test_ic_bitand(void)
}
void
-test_ic_cvt(void)
+test_ic_bitxor(void)
{
- u16 = (u32 & 0x0000ff00);
- u16 = (u32_t)(u32 & 0x0000ff00);
+ /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
+ u8 = u8 ^ u16;
+ u16 = u8 ^ u16;
+
+ // Sign-extend.
+ s8 = (u8 ^ 0x80) - 0x80;
+ s16 = (u16 ^ 0x8000) - 0x8000;
+ s32 = (u32 ^ 0x80000000) - 0x80000000;
+ s64 = (u64 ^ 0x8000000000000000) - 0x8000000000000000;
+}
+
+void
+test_ic_bitor(void)
+{
+ /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
+ u8 = u8 | u16;
+ u16 = u8 | u16;
+ /* expect+1: warning: conversion from 'unsigned int' to 'unsigned short' may lose accuracy [132] */
+ u16 = u8 | u32;
+ u32 = u8 | u32;
+ /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int' may lose accuracy [132] */
+ u32 = u8 | u64;
+ u64 = u8 | u64;
}
void
-test_ic_conditional(char c1, char c2)
+test_ic_quest_colon(char c1, char c2)
{
/* Both operands are representable as char. */
ch = cond ? '?' : ':';
@@ -389,16 +531,148 @@ test_ic_conditional(char c1, char c2)
ch = cond ? c1 : c2;
/*
- * Mixing s8 and u8 results in a number from -128 to 255, which does
- * not necessarily fit into s8.
+ * Mixing s8 and u8 results in a number from -128 to 255, which neither
+ * fits in s8 nor u8.
*/
/* expect+1: warning: conversion from 'int' to 'signed char' may lose accuracy [132] */
s8 = cond ? s8 : u8;
-
- /*
- * Mixing s8 and u8 results in a number from -128 to 255, which does
- * not necessarily fit into u8.
- */
/* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
u8 = cond ? s8 : u8;
}
+
+void
+test_ic_con(void)
+{
+ /* expect+1: warning: assignment of negative constant -1 to unsigned type 'unsigned char' [164] */
+ u8 = -1;
+ u8 = 0;
+ u8 = 255;
+ /* expect+1: warning: constant truncated by assignment [165] */
+ u8 = 256;
+
+ /* expect+1: warning: conversion of 'int' to 'signed char' is out of range [119] */
+ s8 = -129;
+ s8 = -128;
+ s8 = 127;
+ /* expect+1: warning: conversion of 'int' to 'signed char' is out of range [119] */
+ s8 = 128;
+}
+
+void
+test_ic_cvt(void)
+{
+ u16 = (u32 & 0x0000ff00);
+ u16 = (u32_t)(u32 & 0x0000ff00);
+ u16 = (u16_t)u32;
+ u16 = (u8_t)(u32 & 0xffff) << 8;
+ u16 = (int)3.0;
+
+ u8 = (u8_t)(u64 & 0x0f);
+ u8 = (u8_t)(u64 & 0x0f) << 4;
+ /* expect+1: warning: conversion from 'int' to 'unsigned char' may lose accuracy [132] */
+ u8 = (u8_t)(u64 & 0x0f) << 5;
+}
+
+unsigned char
+test_bit_fields(unsigned long long m)
+{
+ /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned int:3' may lose accuracy [132] */
+ bits.u3 = bits.u32 & m;
+
+ bits.u5 = bits.u3 & m;
+ bits.u32 = bits.u5 & m;
+
+ /* expect+1: warning: conversion from 'unsigned long long' to 'unsigned char' may lose accuracy [132] */
+ return bits.u32 & m;
+}
+
+void
+compare_bit_field_to_integer_constant(void)
+{
+ static _Bool b;
+ static struct {
+ short s16:15;
+ unsigned short u16:15;
+ int s32:15;
+ unsigned u32:15;
+ long long s64:15;
+ unsigned long long u64:15;
+ } s;
+
+ // Since decl.c 1.180 from 2021-05-02 and before tree.c 1.624 from
+ // 2024-03-12, lint warned about a possible loss of accuracy [132]
+ // when promoting an 'unsigned long long' bit-field to 'int'.
+ b = s.s16 == 0;
+ b = s.u16 == 0;
+ b = s.s32 == 0;
+ b = s.u32 == 0;
+ b = s.s64 == 0;
+ b = s.u64 == 0;
+ b = !b;
+}
+
+/*
+ * Before tree.c 1.626 from 2024-03-26, the usual arithmetic conversions for
+ * bit-field types with the same base type but different widths simply took
+ * the type of the left operand, leading to wrong warnings about loss of
+ * accuracy when the right operand was wider than the left operand.
+ */
+void
+binary_operators_on_bit_fields(void)
+{
+ struct {
+ u64_t u15:15;
+ u64_t u48:48;
+ u64_t u64;
+ } s = { 0, 0, 0 };
+
+ u64 = s.u15 | s.u48;
+ u64 = s.u48 | s.u15;
+ u64 = s.u15 | s.u48 | s.u64;
+ u64 = s.u64 | s.u48 | s.u15;
+ cond = (s.u15 | s.u48 | s.u64) != 0;
+ cond = (s.u64 | s.u48 | s.u15) != 0;
+
+ // Before tree.c from 1.638 from 2024-05-01, lint wrongly warned:
+ // warning: conversion of 'int' to 'int:4' is out of range [119]
+ s32 = 8 - bits.u3;
+}
+
+unsigned char
+combine_arithmetic_and_bit_operations(void)
+{
+ return 0xc0 | (u32 & 0x07c0) / 64;
+}
+
+long write(int, const char *, size_t);
+long read(int, char *, size_t);
+
+size_t strlen(const char *);
+size_t strcspn(const char *, const char *);
+size_t strspn(const char *, const char *);
+size_t strlcpy(char *, const char *, size_t);
+size_t strlcat(char *, const char *, size_t);
+
+
+void
+limited_range_functions(void)
+{
+ char buf127[127];
+ char buf128[128];
+
+ // Assume that strings with length >= 2 GB are so rare
+ // that there is no point worrying about integer overflows here.
+
+ s32 = strlen("");
+ s32 = strcspn("", "");
+ s32 = strspn("", "");
+ s32 = strlcpy(buf128, "", sizeof(buf128));
+ s32 = strlcat(buf128, "", sizeof(buf128));
+
+ s8 = read(0, buf127, sizeof(buf127));
+ s8 = write(1, buf127, sizeof(buf127));
+ /* expect+1: warning: conversion from 'long' to 'signed char' may lose accuracy [132] */
+ s8 = read(0, buf128, sizeof(buf128));
+ /* expect+1: warning: conversion from 'long' to 'signed char' may lose accuracy [132] */
+ s8 = write(1, buf128, sizeof(buf128));
+}
diff --git a/usr.bin/xlint/lint1/msg_132_lp64.c b/usr.bin/xlint/lint1/msg_132_lp64.c
index 21edfa041b7d..1c26a7131bf1 100644
--- a/usr.bin/xlint/lint1/msg_132_lp64.c
+++ b/usr.bin/xlint/lint1/msg_132_lp64.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_132_lp64.c,v 1.2 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_132_lp64.c,v 1.3 2025/01/03 01:27:35 rillig Exp $ */
# 3 "msg_132_lp64.c"
// Test for message: conversion from '%s' to '%s' may lose accuracy [132]
@@ -6,9 +6,21 @@
/* lint1-extra-flags: -a -X 351 */
/* lint1-only-if: lp64 */
+typedef unsigned int u32_t;
+
+u32_t u32;
+const char *ptr;
+
unsigned int
-convert_pointer_to_smaller_integer(void *ptr)
+convert_pointer_to_smaller_integer(void)
{
/* expect+1: warning: conversion from 'unsigned long' to 'unsigned int' may lose accuracy [132] */
return (unsigned long)(ptr) >> 12;
}
+
+void
+test_ic_minus(void)
+{
+ /* expect+1: warning: conversion from 'long' to 'unsigned int' may lose accuracy [132] */
+ u32 = ptr + 3 - ptr;
+}
diff --git a/usr.bin/xlint/lint1/msg_135.c b/usr.bin/xlint/lint1/msg_135.c
index 32500130093f..d9c01c7be09a 100644
--- a/usr.bin/xlint/lint1/msg_135.c
+++ b/usr.bin/xlint/lint1/msg_135.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_135.c,v 1.15 2023/04/23 11:52:43 rillig Exp $ */
+/* $NetBSD: msg_135.c,v 1.17 2025/03/21 20:37:31 rillig Exp $ */
# 3 "msg_135.c"
// Test for message: converting '%s' to '%s' increases alignment from %u to %u [135]
@@ -107,3 +107,26 @@ cast_to_union(void)
both = (union both *)&align_8;
return both->p_align_8;
}
+
+/*
+ * Structures with alignment 1 typically contain padding arrays only, so don't
+ * warn when they are converted to their structured counterparts. An example
+ * of such a conversion is from 'struct sockaddr' to 'struct sockaddr_in6'.
+ */
+void
+from_alignment_1_to_8(void)
+{
+ struct alignment_1 {
+ char filler[32];
+ };
+ struct alignment_8 {
+ char filler[32];
+ double numbers[4];
+ };
+
+ static struct alignment_1 *pointer_1;
+ static struct alignment_8 *pointer_8;
+
+ pointer_8 = (struct alignment_8 *)pointer_1;
+ pointer_1 = (struct alignment_1 *)pointer_8;
+}
diff --git a/usr.bin/xlint/lint1/msg_138.c b/usr.bin/xlint/lint1/msg_138.c
index d57e72937b03..daadb3f6b536 100644
--- a/usr.bin/xlint/lint1/msg_138.c
+++ b/usr.bin/xlint/lint1/msg_138.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_138.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_138.c,v 1.7 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_138.c"
// Test for message: unknown operand size, op '%s' [138]
@@ -14,8 +14,8 @@ struct incomplete;
void
function(_Bool cond, struct incomplete *i1, struct incomplete *i2)
{
- /* expect+2: error: 'local' has incomplete type 'incomplete struct incomplete' [31] */
- /* expect+1: error: cannot initialize 'incomplete struct incomplete' from 'pointer to incomplete struct incomplete' [185] */
+ /* expect+2: error: cannot initialize 'incomplete struct incomplete' from 'pointer to incomplete struct incomplete' [185] */
+ /* expect+1: error: 'local' has incomplete type 'incomplete struct incomplete' [31] */
struct incomplete local = i1;
/* expect+1: error: unknown operand size, op '=' [138] */
diff --git a/usr.bin/xlint/lint1/msg_141.c b/usr.bin/xlint/lint1/msg_141.c
index ae8ababd1add..cc5766f56699 100644
--- a/usr.bin/xlint/lint1/msg_141.c
+++ b/usr.bin/xlint/lint1/msg_141.c
@@ -1,33 +1,635 @@
-/* $NetBSD: msg_141.c,v 1.7 2023/07/09 11:01:27 rillig Exp $ */
+/* $NetBSD: msg_141.c,v 1.17 2024/03/27 20:09:43 rillig Exp $ */
# 3 "msg_141.c"
-// Test for message: operator '%s' produces integer overflow [141]
+// Test for message: '%s' overflows '%s' [141]
/* lint1-extra-flags: -h -X 351 */
-/*
- * Before tree.c 1.347 from 2021-08-23, lint wrongly warned about integer
- * overflow in '-'.
- */
-int signed_int_max = (1u << 31) - 1;
+// Integer overflow occurs when the arbitrary-precision result of an
+// arithmetic operation cannot be represented by the type of the expression.
-/*
- * Before tree.c 1.347 from 2021-08-23, lint wrongly warned about integer
- * overflow in '-'.
- */
-unsigned int unsigned_int_max = (1u << 31) - 1;
+signed int s32;
+unsigned int u32;
+signed long long s64;
+unsigned long long u64;
+_Bool cond;
-/* expect+1: warning: operator '+' produces integer overflow [141] */
-int int_overflow = (1 << 30) + (1 << 30);
+void
+compl_s32(void)
+{
+ s32 = ~(-0x7fffffff - 1);
+ s32 = ~-1;
+ s32 = ~0;
+ s32 = ~1;
+ s32 = ~0x7fffffff;
+}
-/* expect+2: warning: operator '+' produces integer overflow [141] */
-/* expect+1: warning: initialization of unsigned with negative constant [221] */
-unsigned int intermediate_overflow = (1 << 30) + (1 << 30);
+void
+compl_u32(void)
+{
+ u32 = ~0x00000000U;
+ u32 = ~0x7fffffffU;
+ u32 = ~0x80000000U;
+ u32 = ~0xffffffffU;
+}
-unsigned int no_overflow = (1U << 30) + (1 << 30);
+void
+compl_s64(void)
+{
+ s64 = ~(-0x7fffffffffffffffLL - 1LL);
+ s64 = ~-1LL;
+ s64 = ~0LL;
+ s64 = ~0x7fffffffffffffffLL;
+}
-/* expect+1: warning: operator '-' produces integer overflow [141] */
-unsigned int unsigned_int_min = 0u - (1u << 31);
+void
+compl_u64(void)
+{
+ u64 = ~0ULL;
+ u64 = ~0x7fffffffffffffffULL;
+ u64 = ~0x8000000000000000ULL;
+ u64 = ~0xffffffffffffffffULL;
+}
-/* expect+1: warning: operator '-' produces integer overflow [141] */
-unsigned int unsigned_int_min_unary = -(1u << 31);
+void
+uplus_s32(void)
+{
+ s32 = +(-0x7fffffff - 1);
+ s32 = +-1;
+ s32 = +0;
+ s32 = +0x7fffffff;
+}
+
+void
+uplus_u32(void)
+{
+ u32 = +0x00000000U;
+ u32 = +0x7fffffffU;
+ u32 = +0x80000000U;
+ u32 = +0xffffffffU;
+}
+
+void
+uplus_s64(void)
+{
+ s64 = +(-0x7fffffffffffffffLL - 1LL);
+ s64 = +-1LL;
+ s64 = +0LL;
+ s64 = +0x7fffffffffffffffLL;
+}
+
+void
+uplus_u64(void)
+{
+ u64 = +0x0000000000000000ULL;
+ u64 = +0x7fffffffffffffffULL;
+ u64 = +0x8000000000000000ULL;
+ u64 = +0xffffffffffffffffULL;
+}
+
+void
+uminus_s32(void)
+{
+ /* expect+1: warning: '-(-2147483648)' overflows 'int' [141] */
+ s32 = -(-0x7fffffff - 1);
+ s32 = - -1;
+ s32 = -0;
+ s32 = -0x7fffffff;
+}
+
+void
+uminus_u32(void)
+{
+ u32 = -0x00000000U;
+ u32 = -0x7fffffffU;
+ u32 = -0x80000000U;
+ u32 = -0xffffffffU;
+}
+
+void
+uminus_s64(void)
+{
+ /* expect+1: warning: '-(-9223372036854775808)' overflows 'long long' [141] */
+ s64 = -(-0x7fffffffffffffffLL - 1LL);
+ s64 = - -1LL;
+ s64 = -0LL;
+ s64 = -0x7fffffffffffffffLL;
+}
+
+void
+uminus_u64(void)
+{
+ u64 = -0x0000000000000000ULL;
+ u64 = -0x7fffffffffffffffULL;
+ u64 = -0x8000000000000000ULL;
+ u64 = -0xffffffffffffffffULL;
+}
+
+void
+mult_s32(void)
+{
+ /* expect+1: warning: '-65536 * 65536' overflows 'int' [141] */
+ s32 = -0x00010000 * +0x00010000; // -0x0100000000
+ /* expect+1: warning: '-3 * 715827883' overflows 'int' [141] */
+ s32 = -0x00000003 * +0x2aaaaaab; // -0x80000001
+ /* expect+1: warning: '715827883 * -3' overflows 'int' [141] */
+ s32 = +0x2aaaaaab * -0x00000003; // -0x80000001
+ s32 = -0x00000008 * +0x10000000; // -0x80000000
+ s32 = +0x10000000 * -0x00000008; // -0x80000000
+ s32 = +0x00000002 * +0x3fffffff; // +0x7ffffffe
+ s32 = +0x3fffffff * +0x00000002; // +0x7ffffffe
+ s32 = +0x7fffffff * +0x00000001; // +0x7fffffff
+ s32 = +0x00000001 * +0x7fffffff; // +0x7fffffff
+ /* expect+1: warning: '2 * 1073741824' overflows 'int' [141] */
+ s32 = +0x00000002 * +0x40000000; // +0x80000000
+ /* expect+1: warning: '1073741824 * 2' overflows 'int' [141] */
+ s32 = +0x40000000 * +0x00000002; // +0x80000000
+ /* expect+1: warning: '65535 * 65537' overflows 'int' [141] */
+ s32 = +0x0000ffff * +0x00010001; // +0xffffffff
+ /* expect+1: warning: '65536 * 65536' overflows 'int' [141] */
+ s32 = +0x00010000 * +0x00010000; // +0x0100000000
+}
+
+void
+mult_u32(void)
+{
+ u32 = 0xffffU * 0x10001U; // +0xffffffff
+ /* expect+1: warning: '65536 * 65536' overflows 'unsigned int' [141] */
+ u32 = 0x10000U * 0x10000U; // +0x0100000000
+}
+
+void
+mult_s64(void)
+{
+ /* expect+1: warning: '-4294967296 * 4294967296' overflows 'long long' [141] */
+ s64 = -0x100000000LL * 0x100000000LL; // -0x010000000000000000
+ /* expect+1: warning: '-3 * 3074457345618258603' overflows 'long long' [141] */
+ s64 = -3LL * 0x2aaaaaaaaaaaaaabLL; // -0x8000000000000001
+ /* expect+1: warning: '3074457345618258603 * -3' overflows 'long long' [141] */
+ s64 = 0x2aaaaaaaaaaaaaabLL * -3LL; // -0x8000000000000001
+ s64 = -8LL * +0x1000000000000000LL; // -0x8000000000000000
+ s64 = +0x1000000000000000LL * -8LL; // -0x8000000000000000
+ s64 = +2LL * +0x3fffffffffffffffLL; // +0x7ffffffffffffffe
+ s64 = +0x3fffffffffffffffLL * +2LL; // +0x7ffffffffffffffe
+ s64 = +0x7fffffffffffffffLL * +1LL; // +0x7fffffffffffffff
+ s64 = +1LL * +0x7fffffffffffffffLL; // +0x7fffffffffffffff
+ /* expect+1: warning: '2 * 4611686018427387904' overflows 'long long' [141] */
+ s64 = +2LL * +0x4000000000000000LL; // +0x8000000000000000
+ /* expect+1: warning: '4611686018427387904 * 2' overflows 'long long' [141] */
+ s64 = +0x4000000000000000LL * +2LL; // +0x8000000000000000
+ /* expect+1: warning: '4294967295 * 4294967297' overflows 'long long' [141] */
+ s64 = +0xffffffffLL * +0x100000001LL; // +0xffffffffffffffff
+ /* expect+1: warning: '4294967296 * 4294967296' overflows 'long long' [141] */
+ s64 = +0x100000000LL * +0x100000000LL; // +0x010000000000000000
+}
+
+void
+mult_u64(void)
+{
+ u64 = 0xffffffffULL * 0x100000001ULL; // +0xffffffffffffffff
+ u64 = 0x00010000ULL * 0x00010000ULL; // +0x0100000000
+ /* expect+1: warning: '4294967296 * 4294967296' overflows 'unsigned long long' [141] */
+ u64 = 0x100000000ULL * 0x100000000ULL; // +0x010000000000000000
+}
+
+void
+div_s32(void)
+{
+ /* expect+1: warning: '-2147483648 / -1' overflows 'int' [141] */
+ s32 = (-0x7fffffff - 1) / -1;
+ s32 = (-0x7fffffff - 1) / 1;
+ s32 = 0x7fffffff / -1;
+ /* expect+1: error: division by 0 [139] */
+ s32 = 0 / 0;
+ /* expect+1: error: division by 0 [139] */
+ s32 = 0x7fffffff / 0;
+}
+
+void
+div_u32(void)
+{
+ u32 = 0xffffffffU / -1U;
+ u32 = 0xffffffffU / 1U;
+ /* expect+1: error: division by 0 [139] */
+ u32 = 0U / 0U;
+ /* expect+1: error: division by 0 [139] */
+ u32 = 0xffffffffU / 0U;
+}
+
+void
+div_s64(void)
+{
+ /* expect+1: warning: '-9223372036854775808 / -1' overflows 'long long' [141] */
+ s64 = (-0x7fffffffffffffffLL - 1LL) / -1LL;
+ s64 = (-0x7fffffffffffffffLL - 1LL) / 1LL;
+ s64 = (-0x7fffffffffffffffLL - 1LL) / 0x7fffffffffffffffLL;
+ s64 = 0x7fffffffffffffffLL / -1LL;
+ s64 = (-0x7fffffffLL - 1LL) / -1LL;
+ s64 = (-0x7fffffffLL - 1LL) / 0x7fffffffLL;
+ /* expect+1: error: division by 0 [139] */
+ s64 = 0LL / 0LL;
+ /* expect+1: error: division by 0 [139] */
+ s64 = 0x7fffffffffffffffLL / 0LL;
+}
+
+void
+div_u64(void)
+{
+ u64 = 0xffffffffffffffffULL / -1ULL;
+ u64 = 0xffffffffffffffffULL / 1ULL;
+ /* expect+1: error: division by 0 [139] */
+ u64 = 0ULL / 0ULL;
+ /* expect+1: error: division by 0 [139] */
+ u64 = 0xffffffffffffffffULL / 0ULL;
+}
+
+void
+mod_s32(void)
+{
+ s32 = -1 % (-0x7fffffff - 1);
+ s32 = -1 % 0x7fffffff;
+ /* expect+1: warning: '-2147483648 % -1' overflows 'int' [141] */
+ s32 = (-0x7fffffff - 1) % -1;
+ s32 = 0x7fffffff % -1;
+}
+
+void
+mod_u32(void)
+{
+ u64 = 0xffffffffU % -1U;
+ u64 = 0xffffffffU % 1U;
+ /* expect+1: error: modulus by 0 [140] */
+ u64 = 0U % 0U;
+ /* expect+1: error: modulus by 0 [140] */
+ u64 = 0xffffffffU % 0U;
+}
+
+void
+mod_s64(void)
+{
+ s64 = -1LL % (-0x7fffffffffffffffLL - 1LL);
+ s64 = -1LL % 0x7fffffffffffffffLL;
+ /* expect+1: warning: '-9223372036854775808 % -1' overflows 'long long' [141] */
+ s64 = (-0x7fffffffffffffffLL - 1LL) % -1LL;
+ s64 = 0x7fffffffffffffffLL % -1LL;
+}
+
+void
+mod_u64(void)
+{
+ u64 = 0xffffffffffffffffULL % -1ULL;
+ u64 = 0xffffffffffffffffULL % 1ULL;
+ /* expect+1: error: modulus by 0 [140] */
+ u64 = 0ULL % 0ULL;
+ /* expect+1: error: modulus by 0 [140] */
+ u64 = 0xffffffffffffffffULL % 0ULL;
+}
+
+void
+plus_s32(void)
+{
+ /* expect+1: warning: '-2147483647 + -2147483647' overflows 'int' [141] */
+ s32 = -0x7fffffff + -0x7fffffff;
+ /* expect+1: warning: '-2147483647 + -2' overflows 'int' [141] */
+ s32 = -0x7fffffff + -2; // INT_MIN - 1
+ /* expect+1: warning: '-2 + -2147483647' overflows 'int' [141] */
+ s32 = -2 + -0x7fffffff; // INT_MIN - 1
+ s32 = -0x7fffffff + -1; // INT_MIN
+ s32 = -1 + -0x7fffffff; // INT_MIN
+ s32 = -0x7fffffff + 0; // INT_MIN + 1
+ s32 = 0 + -0x7fffffff; // INT_MIN + 1
+ s32 = (-0x7fffffff - 1) + 0x7fffffff; // -1
+ s32 = 0x7fffffff + (-0x7fffffff - 1); // -1
+ s32 = 0x7ffffffe + 1; // INT_MAX
+ s32 = 1 + 0x7ffffffe; // INT_MAX
+ s32 = 0x7fffffff + 0; // INT_MAX
+ s32 = 0 + 0x7fffffff; // INT_MAX
+ /* expect+1: warning: '2147483647 + 1' overflows 'int' [141] */
+ s32 = 0x7fffffff + 1; // INT_MAX + 1
+ /* expect+1: warning: '1 + 2147483647' overflows 'int' [141] */
+ s32 = 1 + 0x7fffffff; // INT_MAX + 1
+ /* expect+1: warning: '1073741824 + 1073741824' overflows 'int' [141] */
+ s32 = 0x40000000 + 0x40000000; // INT_MAX + 1
+ /* expect+1: warning: '2147483647 + 2147483647' overflows 'int' [141] */
+ s32 = 0x7fffffff + 0x7fffffff;
+}
+
+void
+plus_u32(void)
+{
+ u32 = 0x00000000U + 0x00000000U;
+ u32 = 0x40000000U + 0x40000000U;
+ u32 = 0xffffffffU + 0x00000000U;
+ u32 = 0x00000000U + 0xffffffffU;
+ u32 = 0xfffffffeU + 0x00000001U;
+ /* expect+1: warning: '4294967295 + 1' overflows 'unsigned int' [141] */
+ u32 = 0xffffffffU + 0x00000001U;
+ /* expect+1: warning: '1 + 4294967295' overflows 'unsigned int' [141] */
+ u32 = 0x00000001U + 0xffffffffU;
+ /* expect+1: warning: '4294967295 + 4294967295' overflows 'unsigned int' [141] */
+ u32 = 0xffffffffU + 0xffffffffU;
+}
+
+void
+plus_s64(void)
+{
+ /* expect+1: warning: '-9223372036854775807 + -2' overflows 'long long' [141] */
+ s64 = -0x7fffffffffffffffLL + -2LL;
+ s64 = -0x7fffffffffffffffLL + -1LL;
+ s64 = 0x7ffffffffffffffeLL + 1LL;
+ /* expect+1: warning: '9223372036854775807 + 1' overflows 'long long' [141] */
+ s64 = 0x7fffffffffffffffLL + 1LL;
+}
+
+void
+plus_u64(void)
+{
+ u64 = 0x0000000000000000ULL + 0x0000000000000000ULL;
+ u64 = 0xffffffffffffffffULL + 0x0000000000000000ULL;
+ u64 = 0x0000000000000000ULL + 0xffffffffffffffffULL;
+ u64 = 0xfffffffffffffffeULL + 0x0000000000000001ULL;
+ /* expect+1: warning: '18446744073709551615 + 1' overflows 'unsigned long long' [141] */
+ u64 = 0xffffffffffffffffULL + 0x0000000000000001ULL;
+ /* expect+1: warning: '1 + 18446744073709551615' overflows 'unsigned long long' [141] */
+ u64 = 0x0000000000000001ULL + 0xffffffffffffffffULL;
+ /* expect+1: warning: '18446744073709551615 + 18446744073709551615' overflows 'unsigned long long' [141] */
+ u64 = 0xffffffffffffffffULL + 0xffffffffffffffffULL;
+}
+
+void
+minus_s32(void)
+{
+ /* expect+1: warning: '-2147483647 - 2' overflows 'int' [141] */
+ s32 = -0x7fffffff - 2;
+ s32 = -0x7fffffff - 1;
+ s32 = -0x7fffffff - 1 - 0;
+ s32 = -0x7fffffff - 1 - -1;
+ s32 = 0x7fffffff - 0x7fffffff;
+ s32 = 0x7fffffff - 1;
+ s32 = 0x7fffffff - 0;
+ /* expect+1: warning: '2147483647 - -1' overflows 'int' [141] */
+ s32 = 0x7fffffff - -1;
+}
+
+void
+minus_u32(void)
+{
+ u32 = 0x00000000U - 0x00000000U;
+ /* expect+1: warning: '0 - 1' overflows 'unsigned int' [141] */
+ u32 = 0x00000000U - 0x00000001U;
+ /* expect+1: warning: '0 - 2147483648' overflows 'unsigned int' [141] */
+ u32 = 0x00000000U - 0x80000000U;
+ u32 = 0x80000000U - 0x00000001U;
+ /* expect+1: warning: '0 - 4294967295' overflows 'unsigned int' [141] */
+ u32 = 0x00000000U - 0xffffffffU;
+ u32 = 0xffffffffU - 0x00000000U;
+ u32 = 0xffffffffU - 0xffffffffU;
+}
+
+void
+minus_s64(void)
+{
+ /* expect+1: warning: '-9223372036854775807 - 9223372036854775807' overflows 'long long' [141] */
+ s64 = -0x7fffffffffffffffLL - 0x7fffffffffffffffLL;
+ /* expect+1: warning: '-9223372036854775807 - 2' overflows 'long long' [141] */
+ s64 = -0x7fffffffffffffffLL - 2LL;
+ s64 = -0x7fffffffffffffffLL - 1LL;
+ s64 = -0x7fffffffffffffffLL - 0LL;
+ s64 = -0x7fffffffffffffffLL - -1LL;
+ s64 = 0x7fffffffffffffffLL - 1LL;
+ s64 = 0x7fffffffffffffffLL - 0LL;
+ /* expect+1: warning: '9223372036854775807 - -1' overflows 'long long' [141] */
+ s64 = 0x7fffffffffffffffLL - -1LL;
+ /* expect+1: warning: '9223372036854775807 - -9223372036854775807' overflows 'long long' [141] */
+ s64 = 0x7fffffffffffffffLL - -0x7fffffffffffffffLL;
+}
+
+void
+minus_u64(void)
+{
+ u64 = 0x0000000000000000ULL - 0x0000000000000000ULL;
+ /* expect+1: warning: '0 - 1' overflows 'unsigned long long' [141] */
+ u64 = 0x0000000000000000ULL - 0x0000000000000001ULL;
+ /* expect+1: warning: '0 - 9223372036854775808' overflows 'unsigned long long' [141] */
+ u64 = 0x0000000000000000ULL - 0x8000000000000000ULL;
+ u64 = 0x8000000000000000ULL - 0x0000000000000001ULL;
+ /* expect+1: warning: '0 - 18446744073709551615' overflows 'unsigned long long' [141] */
+ u64 = 0x0000000000000000ULL - 0xffffffffffffffffULL;
+ u64 = 0xffffffffffffffffULL - 0x0000000000000000ULL;
+ u64 = 0xffffffffffffffffULL - 0xffffffffffffffffULL;
+}
+
+void
+shl_s32(void)
+{
+ /* expect+1: warning: '256 << 23' overflows 'int' [141] */
+ s32 = 0x0100 << 23;
+ /* expect+1: warning: '256 << 24' overflows 'int' [141] */
+ s32 = 0x0100 << 24;
+ /* expect+1: warning: shift amount 18446744073709551615 is greater than bit-size 32 of 'int' [122] */
+ s32 = 0 << 0xffffffffffffffff;
+}
+
+void
+shl_u32(void)
+{
+ u32 = 0x0100U << 23;
+ /* expect+1: warning: '256 << 24' overflows 'unsigned int' [141] */
+ u32 = 0x0100U << 24;
+ /* expect+1: warning: negative shift [121] */
+ u32 = 0x0000U << -1;
+ /* expect+1: warning: shift amount 256 is greater than bit-size 32 of 'unsigned int' [122] */
+ u32 = 0x0100U << 0x0100U;
+ /* expect+1: warning: shift amount 4294967295 is greater than bit-size 32 of 'unsigned int' [122] */
+ u32 = 0x0100U << 0xffffffffU;
+ /* expect+1: warning: shift amount 18446744073709551615 is greater than bit-size 32 of 'unsigned int' [122] */
+ u32 = 0x0100U << 0xffffffffffffffffULL;
+}
+
+void
+shl_s64(void)
+{
+ s64 = 1LL << 62;
+ s64 = 1LL << 63;
+ /* expect+1: warning: shift amount 64 equals bit-size of 'long long' [267] */
+ s64 = 1LL << 64;
+}
+
+void
+shl_u64(void)
+{
+ s64 = 1ULL << 62;
+ s64 = 1ULL << 63;
+ /* expect+1: warning: shift amount 64 equals bit-size of 'unsigned long long' [267] */
+ s64 = 1ULL << 64;
+}
+
+void
+shr_s32(void)
+{
+ s32 = -0x7fffffff >> 1;
+ s32 = -10 >> 1;
+ s32 = -9 >> 1;
+ s32 = +9 >> 1;
+ s32 = +10 >> 1;
+ s32 = 0x7fffffff >> 1;
+
+ /* expect+1: error: negative array dimension (-16) [20] */
+ typedef int minus_32_shr_1[-32 >> 1];
+ /* expect+1: error: negative array dimension (-16) [20] */
+ typedef int minus_31_shr_1[-31 >> 1];
+ /* expect+1: error: negative array dimension (-15) [20] */
+ typedef int minus_30_shr_1[-30 >> 1];
+ /* expect+1: error: negative array dimension (-1) [20] */
+ typedef int minus_1_shr_1[-1 >> 31];
+}
+
+void
+shr_u32(void)
+{
+ u32 = 0xffffffffU >> 1;
+ /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */
+ u32 = 0xffffffffU >> 32;
+ u32 = 0x00000000U >> 1;
+}
+
+void
+shr_s64(void)
+{
+ // TODO
+
+ /* expect+1: error: negative array dimension (-16) [20] */
+ typedef int minus_16_shr_0[-16LL >> 0];
+ /* expect+1: error: negative array dimension (-8) [20] */
+ typedef int minus_16_shr_1[-16LL >> 1];
+ /* expect+1: error: negative array dimension (-1) [20] */
+ typedef int minus_16_shr_16[-16LL >> 16];
+ /* expect+1: error: negative array dimension (-1) [20] */
+ typedef int minus_16_shr_40[-16LL >> 40];
+}
+
+void
+shr_u64(void)
+{
+ // TODO
+}
+
+void
+compare_s32(void)
+{
+ cond = 0x7fffffff < (-0x7fffffff - 1);
+ cond = 0x7fffffff <= (-0x7fffffff - 1);
+ cond = 0x7fffffff > (-0x7fffffff - 1);
+ cond = 0x7fffffff >= (-0x7fffffff - 1);
+ cond = 0x7fffffff == (-0x7fffffff - 1);
+ cond = 0x7fffffff != (-0x7fffffff - 1);
+}
+
+void
+compare_u32(void)
+{
+ cond = 0xffffffffU < 0x00000000U;
+ cond = 0xffffffffU <= 0x00000000U;
+ cond = 0xffffffffU > 0x00000000U;
+ cond = 0xffffffffU >= 0x00000000U;
+ cond = 0xffffffffU == 0x00000000U;
+ cond = 0xffffffffU != 0x00000000U;
+}
+
+void
+compare_s64(void)
+{
+ cond = 0x7fffffffffffffffLL < (-0x7fffffffffffffffLL - 1);
+ cond = 0x7fffffffffffffffLL <= (-0x7fffffffffffffffLL - 1);
+ cond = 0x7fffffffffffffffLL > (-0x7fffffffffffffffLL - 1);
+ cond = 0x7fffffffffffffffLL >= (-0x7fffffffffffffffLL - 1);
+ cond = 0x7fffffffffffffffLL == (-0x7fffffffffffffffLL - 1);
+ cond = 0x7fffffffffffffffLL != (-0x7fffffffffffffffLL - 1);
+}
+
+void
+compare_u64(void)
+{
+ cond = 0xffffffffffffffffULL < 0x0000000000000000ULL;
+ cond = 0xffffffffffffffffULL <= 0x0000000000000000ULL;
+ cond = 0xffffffffffffffffULL > 0x0000000000000000ULL;
+ cond = 0xffffffffffffffffULL >= 0x0000000000000000ULL;
+ cond = 0xffffffffffffffffULL == 0x0000000000000000ULL;
+ cond = 0xffffffffffffffffULL != 0x0000000000000000ULL;
+}
+
+void
+bitand_s32(void)
+{
+ s32 = 0x55555555 & -0xff;
+}
+
+void
+bitand_u32(void)
+{
+ u32 = 0xffffffffU & 0x55555555U;
+ u32 = 0x55555555U & 0xaaaaaaaaU;
+}
+
+void
+bitand_s64(void)
+{
+ u64 = ~0x7fffeeeeddddccccLL & 0x1111222233334444LL;
+}
+
+void
+bitand_u64(void)
+{
+ u64 = 0xffffeeeeddddccccULL & 0x1111222233334444ULL;
+}
+
+void
+bitxor_s32(void)
+{
+ s32 = 0x12345678 ^ 0x76543210;
+}
+
+void
+bitxor_u32(void)
+{
+ u32 = 0xffffffffU ^ 0x55555555U;
+ u32 = 0x55555555U ^ 0xaaaaaaaaU;
+}
+
+void
+bitxor_s64(void)
+{
+ s64 = ~0x123456789abcdef0LL ^ 0x0123456789abcdefLL;
+}
+
+void
+bitxor_u64(void)
+{
+ u64 = 0xfedcba9876543210ULL ^ 0x0123456789abcdefULL;
+}
+
+void
+bitor_s32(void)
+{
+ s32 = 0x3333cccc | 0x5555aaaa;
+}
+
+void
+bitor_u32(void)
+{
+ u32 = 0xffffffffU | 0x00000000U;
+ u32 = 0xffffffffU | 0xffffffffU;
+ u32 = 0x55555555U | 0xaaaaaaaaU;
+}
+
+void
+bitor_s64(void)
+{
+ s64 = 0x1111222233334444LL | ~0x0000111122223333LL;
+}
+
+void
+bitor_u64(void)
+{
+ u64 = 0x1111222233334444ULL | 0xffffeeeeddddccccULL;
+}
diff --git a/usr.bin/xlint/lint1/msg_142.c b/usr.bin/xlint/lint1/msg_142.c
index a528335e2c48..8e2001b6ebf9 100644
--- a/usr.bin/xlint/lint1/msg_142.c
+++ b/usr.bin/xlint/lint1/msg_142.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_142.c,v 1.11 2023/07/09 11:01:27 rillig Exp $ */
+/* $NetBSD: msg_142.c,v 1.12 2024/06/08 06:42:59 rillig Exp $ */
# 3 "msg_142.c"
// Test for message: operator '%s' produces floating point overflow [142]
@@ -6,12 +6,6 @@
/* lint1-extra-flags: -X 351 */
/*
- * VAX has floating point formats with different limits than the other
- * platforms, which all implement IEEE 754.
- */
-/* xlint1-skip-if: vax */
-
-/*
* For 96-bit and 128-bit floating point numbers, a different number of
* multipliers is needed to produce an overflow.
*/
diff --git a/usr.bin/xlint/lint1/msg_153.c b/usr.bin/xlint/lint1/msg_153.c
index a722c92331c0..cbfb95930f99 100644
--- a/usr.bin/xlint/lint1/msg_153.c
+++ b/usr.bin/xlint/lint1/msg_153.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_153.c,v 1.7 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_153.c,v 1.12 2025/05/04 08:37:09 rillig Exp $ */
# 3 "msg_153.c"
// Test for message: converting '%s' to incompatible '%s' for argument %d [153]
@@ -7,9 +7,14 @@
typedef double (*unary_operator)(double);
+typedef unsigned char sixteen_bytes[16];
void sink_function_pointer(unary_operator);
void sink_int_pointer(int *);
+void sink_qualifiers(char *, const char *, volatile char *, const volatile char *);
+void take_pointer_to_sixteen_bytes(sixteen_bytes *);
+
+sixteen_bytes bytes;
void
to_function_pointer(int *x)
@@ -24,3 +29,20 @@ to_int_pointer(unary_operator op)
/* expect+1: warning: converting 'pointer to function(double) returning double' to incompatible 'pointer to int' for argument 1 [153] */
sink_int_pointer(op);
}
+
+void
+qualifiers(char *ptr, const volatile char *cvptr)
+{
+ sink_qualifiers(ptr, ptr, ptr, ptr);
+
+ /* expect+3: warning: passing 'pointer to const volatile char' as argument 1 to 'sink_qualifiers' discards 'const volatile' [383] */
+ /* expect+2: warning: passing 'pointer to const volatile char' as argument 2 to 'sink_qualifiers' discards 'volatile' [383] */
+ /* expect+1: warning: passing 'pointer to const volatile char' as argument 3 to 'sink_qualifiers' discards 'const' [383] */
+ sink_qualifiers(cvptr, cvptr, cvptr, cvptr);
+}
+
+void
+pass_pointer_to_array(void)
+{
+ take_pointer_to_sixteen_bytes(&bytes);
+}
diff --git a/usr.bin/xlint/lint1/msg_154.c b/usr.bin/xlint/lint1/msg_154.c
index 2cf9053021b8..9e7cacf64d36 100644
--- a/usr.bin/xlint/lint1/msg_154.c
+++ b/usr.bin/xlint/lint1/msg_154.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_154.c,v 1.6 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_154.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_154.c"
-// Test for message: illegal combination of %s '%s' and %s '%s', arg #%d [154]
+// Test for message: invalid combination of %s '%s' and %s '%s', arg #%d [154]
/* lint1-extra-flags: -X 351 */
@@ -10,6 +10,6 @@ void sink_int(int);
void
example(int *ptr)
{
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to int', arg #1 [154] */
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to int', arg #1 [154] */
sink_int(ptr);
}
diff --git a/usr.bin/xlint/lint1/msg_157.c b/usr.bin/xlint/lint1/msg_157.c
index 3b9a3452c706..a5ed796381d6 100644
--- a/usr.bin/xlint/lint1/msg_157.c
+++ b/usr.bin/xlint/lint1/msg_157.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_157.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_157.c,v 1.6 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_157.c"
-/* Test for message: ANSI C treats constant as unsigned [157] */
+/* Test for message: C90 treats constant as unsigned [157] */
/* lint1-flags: -w -X 351 */
@@ -9,5 +9,5 @@
* A rather strange definition for an ARGB color.
* Luckily, 'double' has more than 32 significant binary digits.
*/
-/* expect+1: warning: ANSI C treats constant as unsigned [157] */
+/* expect+1: warning: C90 treats constant as unsigned [157] */
double white = 0xFFFFFFFF;
diff --git a/usr.bin/xlint/lint1/msg_161.c b/usr.bin/xlint/lint1/msg_161.c
index c33538c78bd9..0575cdaa7fc5 100644
--- a/usr.bin/xlint/lint1/msg_161.c
+++ b/usr.bin/xlint/lint1/msg_161.c
@@ -1,14 +1,16 @@
-/* $NetBSD: msg_161.c,v 1.11 2023/06/19 12:33:43 rillig Exp $ */
+/* $NetBSD: msg_161.c,v 1.13 2025/04/06 20:56:14 rillig Exp $ */
# 3 "msg_161.c"
// Test for message: constant in conditional context [161]
+// This message is not used. There is no evidence that it detects real bugs,
+// instead it produces noise for perfectly valid code.
/* lint1-extra-flags: -h -X 351 */
void
while_1(void)
{
- /* expect+1: warning: constant in conditional context [161] */
+ /* was: warning: constant in conditional context [161] */
while (1)
continue;
}
@@ -16,9 +18,9 @@ while_1(void)
void
while_0(void)
{
- /* expect+1: warning: constant in conditional context [161] */
+ /* was: warning: constant in conditional context [161] */
while (0) {
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'continue' statement not reached [193] */
continue;
}
}
@@ -41,7 +43,7 @@ void
do_while_1(void)
{
do {
- /* expect+1: warning: constant in conditional context [161] */
+ /* was: warning: constant in conditional context [161] */
} while (1);
}
@@ -67,14 +69,14 @@ const _Bool conditions[] = {
0 < 0,
/* XXX: Why no warning here? */
0 != 0,
- /* expect+1: warning: constant in conditional context [161] */
+ /* was: warning: constant in conditional context [161] */
0 == 0 && 1 == 0,
- /* expect+1: warning: constant in conditional context [161] */
+ /* was: warning: constant in conditional context [161] */
1 == 0 || 2 == 1,
- /* expect+2: warning: constant in conditional context [161] */
+ /* was: warning: constant in conditional context [161] */
/* expect+1: error: non-constant initializer [177] */
0 == 0 && ""[0] == '\0',
- /* expect+2: warning: constant in conditional context [161] */
+ /* was: warning: constant in conditional context [161] */
/* expect+1: error: non-constant initializer [177] */
""[0] == '\0' && 0 == 0,
/* C99 6.6p3: Constant expressions shall not contain [...] comma */
diff --git a/usr.bin/xlint/lint1/msg_162.c b/usr.bin/xlint/lint1/msg_162.c
index 717a02081c4e..eeb6451d4f54 100644
--- a/usr.bin/xlint/lint1/msg_162.c
+++ b/usr.bin/xlint/lint1/msg_162.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_162.c,v 1.8 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_162.c,v 1.9 2024/05/11 15:53:38 rillig Exp $ */
# 3 "msg_162.c"
// Test for message: operator '%s' compares '%s' with '%s' [162]
@@ -8,6 +8,7 @@
void
left_unsigned(unsigned int ui)
{
+ /* expect+1: warning: comparing integer 'unsigned int' to floating point constant -5 [379] */
if (ui < -5.0) {
}
diff --git a/usr.bin/xlint/lint1/msg_164.c b/usr.bin/xlint/lint1/msg_164.c
index 5eb121fa8234..6fd0b1a32c2f 100644
--- a/usr.bin/xlint/lint1/msg_164.c
+++ b/usr.bin/xlint/lint1/msg_164.c
@@ -1,20 +1,20 @@
-/* $NetBSD: msg_164.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_164.c,v 1.7 2024/06/08 06:37:06 rillig Exp $ */
# 3 "msg_164.c"
-// Test for message: assignment of negative constant to unsigned type [164]
+// Test for message: assignment of negative constant %lld to unsigned type '%s' [164]
/* lint1-extra-flags: -X 351 */
void
example(void)
{
- /* expect+1: warning: initialization of unsigned with negative constant [221] */
+ /* expect+1: warning: initialization of unsigned type 'unsigned char' with negative constant -3 [221] */
unsigned char uch = -3;
- /* expect+1: warning: assignment of negative constant to unsigned type [164] */
+ /* expect+1: warning: assignment of negative constant -5 to unsigned type 'unsigned char' [164] */
uch = -5;
- /* expect+1: warning: conversion of negative constant to unsigned type [222] */
+ /* expect+1: warning: conversion of negative constant -7 to unsigned type 'unsigned char' [222] */
uch += -7;
- /* expect+1: warning: conversion of negative constant to unsigned type [222] */
+ /* expect+1: warning: conversion of negative constant -1 to unsigned type 'unsigned char' [222] */
uch *= -1;
}
diff --git a/usr.bin/xlint/lint1/msg_165.c b/usr.bin/xlint/lint1/msg_165.c
index 887f408ef630..ca571624255a 100644
--- a/usr.bin/xlint/lint1/msg_165.c
+++ b/usr.bin/xlint/lint1/msg_165.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_165.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_165.c,v 1.7 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_165.c"
// Test for message: constant truncated by assignment [165]
@@ -10,7 +10,7 @@ example(void)
{
unsigned char ch;
- /* expect+2: warning: 'ch' set but not used in function 'example' [191] */
- /* expect+1: warning: constant truncated by assignment [165] */
+ /* expect+2: warning: constant truncated by assignment [165] */
+ /* expect+1: warning: 'ch' set but not used in function 'example' [191] */
ch = 0x1234;
}
diff --git a/usr.bin/xlint/lint1/msg_166.c b/usr.bin/xlint/lint1/msg_166.c
index c35ceb038bd3..29fab45c4e0b 100644
--- a/usr.bin/xlint/lint1/msg_166.c
+++ b/usr.bin/xlint/lint1/msg_166.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_166.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_166.c,v 1.6 2024/06/08 06:37:06 rillig Exp $ */
# 3 "msg_166.c"
// Test for message: precision lost in bit-field assignment [166]
@@ -51,9 +51,9 @@ void example(void) {
bits.minus_8_to_7 = 8;
/* Clang doesn't warn about the -1. */
- /* expect+1: warning: assignment of negative constant to unsigned type [164] */
+ /* expect+1: warning: assignment of negative constant -2 to unsigned type 'unsigned int:1' [164] */
bits.zero_to_1 = -2;
- /* expect+1: warning: assignment of negative constant to unsigned type [164] */
+ /* expect+1: warning: assignment of negative constant -1 to unsigned type 'unsigned int:1' [164] */
bits.zero_to_1 = -1;
bits.zero_to_1 = 0;
bits.zero_to_1 = 1;
@@ -61,9 +61,9 @@ void example(void) {
bits.zero_to_1 = 2;
/* Clang doesn't warn about the -8. */
- /* expect+1: warning: assignment of negative constant to unsigned type [164] */
+ /* expect+1: warning: assignment of negative constant -9 to unsigned type 'unsigned int:4' [164] */
bits.zero_to_15 = -9;
- /* expect+1: warning: assignment of negative constant to unsigned type [164] */
+ /* expect+1: warning: assignment of negative constant -8 to unsigned type 'unsigned int:4' [164] */
bits.zero_to_15 = -8;
bits.zero_to_15 = 0;
bits.zero_to_15 = 15;
diff --git a/usr.bin/xlint/lint1/msg_167.c b/usr.bin/xlint/lint1/msg_167.c
index 7a71a76ac82c..ed2b48f4bcdc 100644
--- a/usr.bin/xlint/lint1/msg_167.c
+++ b/usr.bin/xlint/lint1/msg_167.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_167.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_167.c,v 1.7 2024/03/30 16:47:45 rillig Exp $ */
# 3 "msg_167.c"
-// Test for message: array subscript cannot be negative: %ld [167]
+// Test for message: array subscript %jd cannot be negative [167]
/* lint1-extra-flags: -X 351 */
@@ -10,7 +10,7 @@ example(int *ptr)
{
int arr[6];
- /* expect+1: warning: array subscript cannot be negative: -3 [167] */
+ /* expect+1: warning: array subscript -3 cannot be negative [167] */
arr[-3] = 13;
/*
diff --git a/usr.bin/xlint/lint1/msg_168.c b/usr.bin/xlint/lint1/msg_168.c
index 8d0f0eef3f8f..33ed478a9972 100644
--- a/usr.bin/xlint/lint1/msg_168.c
+++ b/usr.bin/xlint/lint1/msg_168.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_168.c,v 1.10 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_168.c,v 1.13 2024/03/30 17:12:26 rillig Exp $ */
# 3 "msg_168.c"
-// Test for message: array subscript cannot be > %d: %ld [168]
+// Test for message: array subscript %ju cannot be > %d [168]
/* lint1-extra-flags: -X 351 */
@@ -27,7 +27,7 @@ example(void)
print_string(buf + 21); /* undefined behavior, not detected */
print_char(buf[19]);
- /* expect+1: warning: array subscript cannot be > 19: 20 [168] */
+ /* expect+1: warning: array subscript 20 cannot be > 19 [168] */
print_char(buf[20]);
}
@@ -41,7 +41,7 @@ array_with_c99_initializer(void)
};
print_string(to_roman['9']);
- /* expect+1: warning: array subscript cannot be > 57: 58 [168] */
+ /* expect+1: warning: array subscript 58 cannot be > 57 [168] */
print_string(to_roman[':']);
}
diff --git a/usr.bin/xlint/lint1/msg_169.c b/usr.bin/xlint/lint1/msg_169.c
index 98f4b816ce35..15170bb7b1a9 100644
--- a/usr.bin/xlint/lint1/msg_169.c
+++ b/usr.bin/xlint/lint1/msg_169.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_169.c,v 1.8 2023/07/07 06:03:31 rillig Exp $ */
+/* $NetBSD: msg_169.c,v 1.10 2024/12/15 06:04:17 rillig Exp $ */
# 3 "msg_169.c"
-// Test for message: precedence confusion possible: parenthesize! [169]
+// Test for message: possible precedence confusion between '%s' and '%s' [169]
/* lint1-flags: -g -h -S -w -X 191,351 */
@@ -12,60 +12,70 @@ confusing_shift_arith(unsigned a, unsigned b, unsigned c, unsigned char ch)
{
unsigned con, okl, okr;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = a + b << c;
okl = (a + b) << c;
okr = a + (b << c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = a << b + c;
okl = (a << b) + c;
okr = a << (b + c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '>>' and '-' [169] */
con = a - b >> c;
okl = (a - b) >> c;
okr = a - (b >> c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '>>' and '-' [169] */
con = a >> b - c;
okl = (a >> b) - c;
okr = a >> (b - c);
// Parenthesizing the inner operands has no effect on the warning.
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = (a) + b << c;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = a + (b) << c;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = a + b << (c);
// The usual arithmetic promotions have no effect on the warning.
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = ch + b << c;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = a + ch << c;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '<<' and '+' [169] */
con = a + b << ch;
}
void
-confusing_logical(bool a, bool b, bool c)
+confusing_logical(bool a, bool b, bool c, bool d)
{
- bool con, okl, okr, eql;
+ bool con, okl, okr, okb, eql;
eql = a && b && c;
eql = a || b || c;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
con = a && b || c;
okl = (a && b) || c;
okr = a && (b || c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
con = a || b && c;
okl = (a || b) && c;
okr = a || (b && c);
+
+ // When both nested operands have confusing precedence, there's only
+ // a single warning, as that is enough to point to the issue.
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
+ con = a && b || c && d;
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
+ okl = (a && b) || c && d;
+ /* expect+1: warning: possible precedence confusion between '||' and '&&' [169] */
+ okr = a && b || (c && d);
+ okb = (a && b) || (c && d);
}
void
@@ -77,48 +87,48 @@ confusing_bitwise(unsigned a, unsigned b, unsigned c)
eql = a | b | c;
eql = a ^ b ^ c;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '^' [169] */
con = a | b ^ c;
okl = (a | b) ^ c;
okr = a | (b ^ c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
con = a | b & c;
okl = (a | b) & c;
okr = a | (b & c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '^' [169] */
con = a ^ b | c;
okl = (a ^ b) | c;
okr = a ^ (b | c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '^' and '&' [169] */
con = a ^ b & c;
okl = (a ^ b) & c;
okr = a ^ (b & c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
con = a & b | c;
okl = (a & b) ^ c;
okr = a & (b ^ c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '^' and '&' [169] */
con = a & b ^ c;
okl = (a & b) ^ c;
okr = a & (b ^ c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '&' and '+' [169] */
con = a & b + c;
okl = (a & b) + c;
okr = a & (b + c);
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '-' [169] */
con = a - b | c;
okl = (a - b) | c;
okr = a - (b | c);
// This looks like a binomial formula but isn't.
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '^' and '+' [169] */
con = a ^ 2 - 2 * a * b + b ^ 2;
// This isn't a binomial formula either since '^' means xor.
@@ -144,14 +154,14 @@ cast_expressions(char a, char b, char c)
// Adding casts to the leaf nodes doesn't change anything about the
// confusing precedence.
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
con = (unsigned)a | (unsigned)b & (unsigned)c;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
con = (unsigned)a & (unsigned)b | (unsigned)c;
// Adding a cast around the whole calculation doesn't change the
// precedence as well.
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
con = (unsigned)(a | b & c);
// Adding a cast around an intermediate result groups the operands
@@ -175,7 +185,7 @@ implicit_conversion_to_long(long la, int a)
{
int ok;
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
ok = a & a | la;
/*
@@ -185,7 +195,7 @@ implicit_conversion_to_long(long la, int a)
* conversion or an explicit cast between the main operator ('|') and
* the nested operator ('&').
*/
- /* expect+1: warning: precedence confusion possible: parenthesize! [169] */
+ /* expect+1: warning: possible precedence confusion between '|' and '&' [169] */
ok = la | a & a;
ok = (a & a) | la; /* always ok */
diff --git a/usr.bin/xlint/lint1/msg_174.c b/usr.bin/xlint/lint1/msg_174.c
index 62a1d5b06a43..489d9fec3fe9 100644
--- a/usr.bin/xlint/lint1/msg_174.c
+++ b/usr.bin/xlint/lint1/msg_174.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_174.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_174.c,v 1.7 2024/05/09 20:53:13 rillig Exp $ */
# 3 "msg_174.c"
-// Test for message: too many initializers [174]
+// Test for message: too many initializers for '%s' [174]
/* lint1-extra-flags: -X 351 */
@@ -11,7 +11,7 @@ example(void)
/* A single pair of braces is always allowed. */
int n = { 13 };
- /* expect+1: error: too many initializers [174] */
+ /* expect+1: error: too many initializers for 'int' [174] */
int too_many = { 17, 19 };
/*
diff --git a/usr.bin/xlint/lint1/msg_177.c b/usr.bin/xlint/lint1/msg_177.c
index d2ab8d2c1065..42c8c09e87ee 100644
--- a/usr.bin/xlint/lint1/msg_177.c
+++ b/usr.bin/xlint/lint1/msg_177.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_177.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_177.c,v 1.5 2025/02/24 19:49:00 rillig Exp $ */
# 3 "msg_177.c"
// Test for message: non-constant initializer [177]
@@ -14,3 +14,7 @@ const int var = not_a_constant;
/* expect+1: error: non-constant initializer [177] */
const int calling_function = function();
+
+// A compound expression is not a constant expression.
+/* expect+1: error: non-constant initializer [177] */
+const int compound_expression = (int){ 3 };
diff --git a/usr.bin/xlint/lint1/msg_182.c b/usr.bin/xlint/lint1/msg_182.c
index 3eca521eb634..b47a8220cadd 100644
--- a/usr.bin/xlint/lint1/msg_182.c
+++ b/usr.bin/xlint/lint1/msg_182.c
@@ -1,21 +1,21 @@
-/* $NetBSD: msg_182.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_182.c,v 1.8 2024/11/23 00:01:48 rillig Exp $ */
# 3 "msg_182.c"
-// Test for message: incompatible pointer types to '%s' and '%s' [182]
+// Test for message: '%s' discards '%s' from '%s' [182]
/* lint1-extra-flags: -X 351 */
void *
return_discarding_volatile(volatile void *arg)
{
- /* expect+1: warning: incompatible pointer types to 'void' and 'volatile void' [182] */
+ /* expect+1: warning: 'return' discards 'volatile' from 'pointer to volatile void' [182] */
return arg;
}
void
init_discarding_volatile(volatile void *arg)
{
- /* expect+2: warning: 'array' set but not used in function 'init_discarding_volatile' [191] */
- /* expect+1: warning: incompatible pointer types to 'void' and 'volatile void' [182] */
+ /* expect+2: warning: 'init' discards 'volatile' from 'pointer to volatile void' [182] */
+ /* expect+1: warning: 'array' set but not used in function 'init_discarding_volatile' [191] */
void *array[] = { arg };
}
diff --git a/usr.bin/xlint/lint1/msg_183.c b/usr.bin/xlint/lint1/msg_183.c
index 0bd2fa07a143..96d37a2985f0 100644
--- a/usr.bin/xlint/lint1/msg_183.c
+++ b/usr.bin/xlint/lint1/msg_183.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_183.c,v 1.6 2023/07/09 11:18:55 rillig Exp $ */
+/* $NetBSD: msg_183.c,v 1.8 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_183.c"
-// Test for message: illegal combination of %s '%s' and %s '%s' [183]
+// Test for message: invalid combination of %s '%s' and %s '%s' for '%s' [183]
/* lint1-extra-flags: -X 351 */
@@ -9,12 +9,15 @@
void *
example(double x, int i, void *vp, int *ip, double *dp, void (*fp)(void))
{
+ /* expect+1: warning: invalid combination of pointer 'pointer to void' and integer 'int' for 'init' [183] */
+ void *local_vp = i;
+
if (i < 0)
/* expect+1: error: function has return type 'pointer to void' but returns 'double' [211] */
return x;
if (i < 1)
- /* expect+1: warning: illegal combination of pointer 'pointer to void' and integer 'int' [183] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to void' and integer 'int' for 'return' [183] */
return i;
if (i < 2)
diff --git a/usr.bin/xlint/lint1/msg_184.c b/usr.bin/xlint/lint1/msg_184.c
index d019991f3798..7d9d04b4fd6b 100644
--- a/usr.bin/xlint/lint1/msg_184.c
+++ b/usr.bin/xlint/lint1/msg_184.c
@@ -1,13 +1,13 @@
-/* $NetBSD: msg_184.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_184.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_184.c"
-// Test for message: illegal combination of '%s' and '%s' [184]
+// Test for message: invalid combination of '%s' and '%s' [184]
/* lint1-extra-flags: -X 351 */
int *
example(char *cp)
{
- /* expect+1: warning: illegal combination of 'pointer to int' and 'pointer to char' [184] */
+ /* expect+1: warning: invalid combination of 'pointer to int' and 'pointer to char' [184] */
return cp;
}
diff --git a/usr.bin/xlint/lint1/msg_186.c b/usr.bin/xlint/lint1/msg_186.c
index 78e753e5cc97..1388cd2e9364 100644
--- a/usr.bin/xlint/lint1/msg_186.c
+++ b/usr.bin/xlint/lint1/msg_186.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_186.c,v 1.6 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_186.c,v 1.7 2024/03/29 07:35:45 rillig Exp $ */
# 3 "msg_186.c"
-/* Test for message: bit-field initialization is illegal in traditional C [186] */
+/* Test for message: bit-field initializer must be an integer in traditional C [186] */
/* lint1-flags: -tw -X 351 */
@@ -13,8 +13,7 @@ struct bit_field {
struct bit_field bit_field = {
1,
- /* expect+1: warning: bit-field initialization is illegal in traditional C [186] */
+ /* expect+1: warning: bit-field initializer must be an integer in traditional C [186] */
3.0,
2
};
-/* XXX: The message is misleading. Initialization using integers is ok. */
diff --git a/usr.bin/xlint/lint1/msg_187.c b/usr.bin/xlint/lint1/msg_187.c
index 16a3e0f262e4..d6d064ab5ff7 100644
--- a/usr.bin/xlint/lint1/msg_187.c
+++ b/usr.bin/xlint/lint1/msg_187.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_187.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_187.c,v 1.6 2024/03/27 19:28:20 rillig Exp $ */
# 3 "msg_187.c"
-// Test for message: string literal too long (%lu) for target array (%lu) [187]
+// Test for message: string literal too long (%ju) for target array (%ju) [187]
/* lint1-extra-flags: -X 351 */
diff --git a/usr.bin/xlint/lint1/msg_188.c b/usr.bin/xlint/lint1/msg_188.c
index c9f9b67b2120..efe4ca1a8e72 100644
--- a/usr.bin/xlint/lint1/msg_188.c
+++ b/usr.bin/xlint/lint1/msg_188.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_188.c,v 1.6 2023/07/07 06:03:31 rillig Exp $ */
+/* $NetBSD: msg_188.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_188.c"
-/* Test for message: no automatic aggregate initialization in traditional C [188] */
+/* Test for message: automatic aggregate initialization requires C90 or later [188] */
/* lint1-flags: -tw -X 351 */
@@ -18,8 +18,8 @@ struct point global = {
void
function()
{
- /* expect+2: warning: 'local' set but not used in function 'function' [191] */
- /* expect+1: warning: no automatic aggregate initialization in traditional C [188] */
+ /* expect+2: warning: automatic aggregate initialization requires C90 or later [188] */
+ /* expect+1: warning: 'local' set but not used in function 'function' [191] */
struct point local = {
3,
4,
diff --git a/usr.bin/xlint/lint1/msg_189.c b/usr.bin/xlint/lint1/msg_189.c
index 05d4788cd1bf..2944bcb01653 100644
--- a/usr.bin/xlint/lint1/msg_189.c
+++ b/usr.bin/xlint/lint1/msg_189.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_189.c,v 1.6 2022/06/17 18:54:53 rillig Exp $ */
+/* $NetBSD: msg_189.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_189.c"
-/* Test for message: assignment of struct/union illegal in traditional C [189] */
+/* Test for message: assignment of struct/union invalid in traditional C [189] */
/* This message is not used. */
/* lint1-flags: -tw */
diff --git a/usr.bin/xlint/lint1/msg_192.c b/usr.bin/xlint/lint1/msg_192.c
index f73b846a4f15..afbd919be9e8 100644
--- a/usr.bin/xlint/lint1/msg_192.c
+++ b/usr.bin/xlint/lint1/msg_192.c
@@ -1,14 +1,62 @@
-/* $NetBSD: msg_192.c,v 1.6 2023/07/09 11:18:55 rillig Exp $ */
+/* $NetBSD: msg_192.c,v 1.12 2024/09/28 15:51:40 rillig Exp $ */
# 3 "msg_192.c"
// Test for message: '%s' unused in function '%s' [192]
+//
+// See also:
+// msg_231 for unused parameters
/* lint1-extra-flags: -X 351 */
void
-/* expect+1: warning: parameter 'param' unused in function 'example' [231] */
-example(int param)
+example(void)
{
- /* expect+1: warning: 'local' unused in function 'example' [192] */
- int local;
+ /* expect+1: warning: 'local_scalar' unused in function 'example' [192] */
+ int local_scalar;
+ /* expect+1: warning: 'local_ptr' unused in function 'example' [192] */
+ char *local_ptr;
+ /* expect+1: warning: 'local_arr' unused in function 'example' [192] */
+ char local_arr[5];
+ /* expect+1: warning: 'local_func' unused in function 'example' [192] */
+ void (*local_func)(int, double);
+ typedef void (*handler)(int);
+ /* expect+1: warning: 'local_signal' unused in function 'example' [192] */
+ handler (*local_signal)(int, handler);
+
+ int local_scalar_attr __attribute__((__unused__));
+ char *local_ptr_attr __attribute__((__unused__));
+ char local_arr_attr[5] __attribute__((__unused__));
+ void (*local_func_attr)(int, double) __attribute__((__unused__));
+ void (*(*local_signal_attr)(int sig, void (*handler)(int)))(int) __attribute__((__unused__));
+}
+
+
+void assertion_failed(const char *, int, const char *, const char *);
+
+/*
+ * The symbol '__func__' only occurs in an unreachable branch. It is
+ * nevertheless marked as used.
+ */
+void
+assert_true(void)
+{
+ sizeof(char) == 1
+ ? (void)0
+ : assertion_failed("file", 26, __func__, "sizeof(char) == 1");
+}
+
+void
+assert_false(void)
+{
+ sizeof(char) == 0
+ ? (void)0
+ : assertion_failed("file", 34, __func__, "sizeof(char) == 0");
+}
+
+void
+assert_unknown(_Bool cond)
+{
+ cond
+ ? (void)0
+ : assertion_failed("file", 42, __func__, "cond");
}
diff --git a/usr.bin/xlint/lint1/msg_193.c b/usr.bin/xlint/lint1/msg_193.c
index df223fd6d057..d7968563d6d8 100644
--- a/usr.bin/xlint/lint1/msg_193.c
+++ b/usr.bin/xlint/lint1/msg_193.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_193.c,v 1.21 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_193.c,v 1.22 2024/11/13 04:32:49 rillig Exp $ */
# 3 "msg_193.c"
-// Test for message: statement not reached [193]
+// Test for message: '%s' statement not reached [193]
/* lint1-extra-flags: -X 351 */
@@ -626,7 +626,7 @@ void
lint_annotation_NOTREACHED(void)
{
if (0) {
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'call' statement not reached [193] */
unreachable();
}
@@ -654,7 +654,7 @@ lint_annotation_NOTREACHED(void)
* marks that branch as not reached, which means that any following
* statement cannot be reached as well.
*/
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'if' statement not reached [193] */
if (1)
/* NOTREACHED */
suppressed();
@@ -703,7 +703,7 @@ test_null_statement(void)
for (int i = 0; i < 10; i++)
;
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'empty' statement not reached [193] */
return 0;;
}
diff --git a/usr.bin/xlint/lint1/msg_196.c b/usr.bin/xlint/lint1/msg_196.c
index 2a078a7b5d83..037d7d6bc05f 100644
--- a/usr.bin/xlint/lint1/msg_196.c
+++ b/usr.bin/xlint/lint1/msg_196.c
@@ -1,8 +1,23 @@
-/* $NetBSD: msg_196.c,v 1.3 2022/06/16 16:58:36 rillig Exp $ */
+/* $NetBSD: msg_196.c,v 1.6 2025/02/27 06:48:29 rillig Exp $ */
# 3 "msg_196.c"
-// Test for message: case label affected by conversion [196]
+// Test for message: case label is converted from '%s' to '%s' [196]
-/* expect+1: error: syntax error ':' [249] */
-TODO: "Add example code that triggers the above message."
-TODO: "Add example code that almost triggers the above message."
+/* lint1-extra-flags: -X 351 */
+
+// C23 6.8.5.3p5 says: [...] The constant expression in each case label is
+// converted to the promoted type of the controlling expression. [...]
+
+void
+switch_int_unsigned(int x)
+{
+ switch (x) {
+ /* expect+1: warning: case label is converted from 'unsigned int' to 'int' [196] */
+ case (unsigned int)-1:
+ /* expect+1: warning: case label is converted from 'unsigned int' to 'int' [196] */
+ case -2U:
+ /* expect+1: warning: case label is converted from 'unsigned long long' to 'int' [196] */
+ case 0x1000200030004000ULL:
+ return;
+ }
+}
diff --git a/usr.bin/xlint/lint1/msg_199.c b/usr.bin/xlint/lint1/msg_199.c
index 83922bbed5c3..583fb8b715d8 100644
--- a/usr.bin/xlint/lint1/msg_199.c
+++ b/usr.bin/xlint/lint1/msg_199.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_199.c,v 1.4 2023/07/09 11:01:27 rillig Exp $ */
+/* $NetBSD: msg_199.c,v 1.5 2024/03/27 19:28:20 rillig Exp $ */
# 3 "msg_199.c"
-// Test for message: duplicate case '%ld' in switch [199]
+// Test for message: duplicate case '%jd' in switch [199]
/* lint1-extra-flags: -X 351 */
diff --git a/usr.bin/xlint/lint1/msg_200.c b/usr.bin/xlint/lint1/msg_200.c
index 1671cd437851..39f5f783feef 100644
--- a/usr.bin/xlint/lint1/msg_200.c
+++ b/usr.bin/xlint/lint1/msg_200.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_200.c,v 1.5 2023/07/09 11:01:27 rillig Exp $ */
+/* $NetBSD: msg_200.c,v 1.6 2024/03/27 19:28:20 rillig Exp $ */
# 3 "msg_200.c"
-// Test for message: duplicate case '%lu' in switch [200]
+// Test for message: duplicate case '%ju' in switch [200]
/* lint1-extra-flags: -X 351 */
diff --git a/usr.bin/xlint/lint1/msg_205.c b/usr.bin/xlint/lint1/msg_205.c
index c04c74b9cd1b..6586a4259cd0 100644
--- a/usr.bin/xlint/lint1/msg_205.c
+++ b/usr.bin/xlint/lint1/msg_205.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_205.c,v 1.4 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_205.c,v 1.5 2026/01/10 19:50:40 rillig Exp $ */
# 3 "msg_205.c"
-// Test for message: switch expression must have integral type [205]
+// Test for message: switch expression must have integral type, not '%s' [205]
/* lint1-extra-flags: -X 351 */
@@ -9,7 +9,9 @@
void
example(double x)
{
- /* expect+1: error: switch expression must have integral type [205] */
+ /* expect+1: error: switch expression must have integral type, not 'double' [205] */
switch (x) {
+ case 0:
+ break;
}
}
diff --git a/usr.bin/xlint/lint1/msg_207.c b/usr.bin/xlint/lint1/msg_207.c
index 83ae4653995d..1a091d7adecd 100644
--- a/usr.bin/xlint/lint1/msg_207.c
+++ b/usr.bin/xlint/lint1/msg_207.c
@@ -1,8 +1,53 @@
-/* $NetBSD: msg_207.c,v 1.3 2022/06/16 21:24:41 rillig Exp $ */
+/* $NetBSD: msg_207.c,v 1.6 2025/07/07 19:57:17 rillig Exp $ */
# 3 "msg_207.c"
// Test for message: loop not entered at top [207]
+// This message is not used.
+// Its purpose is unclear, and the number of false positives is too high.
-/* expect+1: error: syntax error ':' [249] */
-TODO: "Add example code that triggers the above message."
-TODO: "Add example code that almost triggers the above message."
+static void
+/* expect+1: warning: static function 'for_loop' unused [236] */
+for_loop(void)
+{
+ for (int i = 0; i < 10; i++)
+ if (0 == 1)
+ for (i = 0;
+ i < 5;
+ /* was+2: warning: loop not entered at top [207] */
+ /* expect+1: warning: end-of-loop code not reached [223] */
+ i += 4)
+ return;
+
+ // XXX: Why is this different from the snippet above?
+ for (int i = 0; i < 10; i++)
+ if (0 == 1)
+ /* expect+1: warning: 'init' statement not reached [193] */
+ for (int j = 0;
+ j < 5;
+ /* expect+1: warning: end-of-loop code not reached [223] */
+ j += 4)
+ return;
+}
+
+static void
+/* expect+1: warning: static function 'while_loop' unused [236] */
+while_loop(void)
+{
+ for (int i = 0; i < 10; i++)
+ if (0 == 1)
+ /* was+1: warning: loop not entered at top [207] */
+ while (i < 5)
+ i += 4;
+}
+
+static void
+/* expect+1: warning: static function 'do_loop' unused [236] */
+do_loop(void)
+{
+ for (int i = 0; i < 10; i++)
+ if (0 == 1)
+ /* was+1: warning: loop not entered at top [207] */
+ do {
+ i += 4;
+ } while (i < 5);
+}
diff --git a/usr.bin/xlint/lint1/msg_211.c b/usr.bin/xlint/lint1/msg_211.c
index 12ab697bf2da..67d1142fdd8b 100644
--- a/usr.bin/xlint/lint1/msg_211.c
+++ b/usr.bin/xlint/lint1/msg_211.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_211.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_211.c,v 1.9 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_211.c"
// Test for message: function has return type '%s' but returns '%s' [211]
@@ -15,10 +15,25 @@ return_int(double dbl, void *ptr, struct str str)
if (dbl > 0.0)
return dbl;
if (ptr != (void *)0)
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to void' for 'return' [183] */
return ptr;
if (str.member > 0)
/* expect+1: error: function has return type 'int' but returns 'struct str' [211] */
return str;
return 3;
}
+
+enum A {
+ A
+};
+
+enum B {
+ B
+};
+
+enum A
+return_enum(enum B arg)
+{
+ /* expect+1: warning: function has return type 'enum A' but returns 'enum B' [211] */
+ return arg;
+}
diff --git a/usr.bin/xlint/lint1/msg_217.c b/usr.bin/xlint/lint1/msg_217.c
index 97bf077be841..808e62174e49 100644
--- a/usr.bin/xlint/lint1/msg_217.c
+++ b/usr.bin/xlint/lint1/msg_217.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_217.c,v 1.12 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_217.c,v 1.17 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_217.c"
// Test for message: function '%s' falls off bottom without returning value [217]
@@ -65,9 +65,56 @@ unreachable_continue_falls_through(void)
{
for (;;) {
if (0)
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'continue' statement not reached [193] */
continue;
break;
}
}
/* expect-1: warning: function 'unreachable_continue_falls_through' falls off bottom without returning value [217] */
+
+
+_Noreturn void noreturn_c11(void);
+[[noreturn]] void noreturn_c23(void);
+__attribute__((__noreturn__)) void noreturn_gnu_prefix(void);
+void __attribute__((__noreturn__)) noreturn_gnu_infix(void);
+void noreturn_gnu_suffix(void) __attribute__((__noreturn__));
+
+int
+call_noreturn_c11(void)
+{
+ noreturn_c11();
+}
+
+inline int
+call_noreturn_c23(void)
+{
+ noreturn_c23();
+}
+
+int
+call_noreturn_gnu_prefix(void)
+{
+ noreturn_gnu_prefix();
+}
+
+int
+call_noreturn_gnu_infix(void)
+{
+ noreturn_gnu_infix();
+}
+
+int
+call_noreturn_gnu_suffix(void)
+{
+ noreturn_gnu_suffix();
+}
+
+
+double *force_function_attributes_in_diagnostic[] = {
+ // Force the word 'noreturn' to occur in a diagnostic.
+ /* expect+1: warning: invalid combination of 'pointer to double' and 'pointer to noreturn function(void) returning void', op 'init' [124] */
+ noreturn_c23,
+ // The 'inline' does affect the type of the function.
+ /* expect+1: warning: invalid combination of 'pointer to double' and 'pointer to function(void) returning int', op 'init' [124] */
+ call_noreturn_c23,
+};
diff --git a/usr.bin/xlint/lint1/msg_218.c b/usr.bin/xlint/lint1/msg_218.c
index 3d8bd6eeafa9..3379e0aab13c 100644
--- a/usr.bin/xlint/lint1/msg_218.c
+++ b/usr.bin/xlint/lint1/msg_218.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_218.c,v 1.8 2023/07/08 11:03:00 rillig Exp $ */
+/* $NetBSD: msg_218.c,v 1.10 2024/01/28 06:57:41 rillig Exp $ */
# 3 "msg_218.c"
-/* Test for message: ANSI C treats constant as unsigned, op '%s' [218] */
+/* Test for message: C90 treats constant as unsigned, op '%s' [218] */
/* lint1-only-if: ilp32 */
/* lint1-flags: -w -X 351 */
@@ -20,40 +20,41 @@ void sink_int(int);
void
test_signed_int(void)
{
- /* expect+2: warning: ANSI C treats constant as unsigned, op '-' [218] */
+ /* expect+3: warning: integer constant out of range [252] */
+ /* expect+2: warning: C90 treats constant as unsigned, op '-' [218] */
/* expect+1: warning: conversion of 'unsigned long' to 'int' is out of range, arg #1 [295] */
sink_int(-2147483648);
}
/*
- * In traditional C, integer constants with an 'L' suffix that didn't fit
- * into 'long' were promoted to the next larger integer type, if that existed
- * at all, as the suffix 'LL' was introduced by C90.
- *
- * Starting with C90, integer constants with an 'L' suffix that didn't fit
- * into 'long' were promoted to 'unsigned long' first, before trying 'long
- * long'.
- *
- * In C99 mode, this distinction is no longer necessary since it is far
- * enough from traditional C.
+ * TODO: Investigate whether the message 218 is actually correct.
+ * See C1978 2.4.1 "Integer constants" and 6.6 "Arithmetic conversions".
*/
void
compare_large_constant(void)
{
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = s32 < 3000000000L;
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = 3000000000L < s32;
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = u32 < 3000000000L;
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = 3000000000L < u32;
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = s64 < 3000000000L;
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = 3000000000L < s64;
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = u64 < 3000000000L;
- /* expect+1: warning: ANSI C treats constant as unsigned, op '<' [218] */
+ /* expect+2: warning: integer constant out of range [252] */
+ /* expect+1: warning: C90 treats constant as unsigned, op '<' [218] */
cond = 3000000000L < u64;
}
diff --git a/usr.bin/xlint/lint1/msg_219.c b/usr.bin/xlint/lint1/msg_219.c
index aaef3490ec16..827b51670c57 100644
--- a/usr.bin/xlint/lint1/msg_219.c
+++ b/usr.bin/xlint/lint1/msg_219.c
@@ -1,27 +1,27 @@
-/* $NetBSD: msg_219.c,v 1.6 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_219.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_219.c"
-/* Test for message: concatenated strings are illegal in traditional C [219] */
+/* Test for message: concatenated strings require C90 or later [219] */
/* lint1-flags: -t -w -X 351 */
char concat1[] = "one";
-/* expect+1: warning: concatenated strings are illegal in traditional C [219] */
+/* expect+1: warning: concatenated strings require C90 or later [219] */
char concat2[] = "one" "two";
-/* expect+2: warning: concatenated strings are illegal in traditional C [219] */
-/* expect+1: warning: concatenated strings are illegal in traditional C [219] */
+/* expect+2: warning: concatenated strings require C90 or later [219] */
+/* expect+1: warning: concatenated strings require C90 or later [219] */
char concat3[] = "one" "two" "three";
-/* expect+3: warning: concatenated strings are illegal in traditional C [219] */
-/* expect+2: warning: concatenated strings are illegal in traditional C [219] */
-/* expect+1: warning: concatenated strings are illegal in traditional C [219] */
+/* expect+3: warning: concatenated strings require C90 or later [219] */
+/* expect+2: warning: concatenated strings require C90 or later [219] */
+/* expect+1: warning: concatenated strings require C90 or later [219] */
char concat4[] = "one" "two" "three" "four";
char concat4lines[] =
"one"
- /* expect+1: warning: concatenated strings are illegal in traditional C [219] */
+ /* expect+1: warning: concatenated strings require C90 or later [219] */
"two"
- /* expect+1: warning: concatenated strings are illegal in traditional C [219] */
+ /* expect+1: warning: concatenated strings require C90 or later [219] */
"three"
- /* expect+1: warning: concatenated strings are illegal in traditional C [219] */
+ /* expect+1: warning: concatenated strings require C90 or later [219] */
"four";
diff --git a/usr.bin/xlint/lint1/msg_220.c b/usr.bin/xlint/lint1/msg_220.c
index a22af928fdb1..f76a7664e955 100644
--- a/usr.bin/xlint/lint1/msg_220.c
+++ b/usr.bin/xlint/lint1/msg_220.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_220.c,v 1.9 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_220.c,v 1.11 2025/05/08 20:51:41 rillig Exp $ */
# 3 "msg_220.c"
// Test for message: fallthrough on case statement [220]
@@ -79,3 +79,31 @@ annotation_comment_variations(int n)
println("6");
}
}
+
+
+void do_return(void);
+void noreturn(void)
+ __attribute__((__noreturn__));
+void noreturn_attr_comma(void)
+ __attribute__((__unused__, __noreturn__));
+void noreturn_attr_attr(void)
+ __attribute__((__unused__))
+ __attribute__((__noreturn__));
+
+void
+call_noreturn(void)
+{
+ switch (0) {
+ case 0:
+ do_return();
+ /* expect+1: warning: fallthrough on case statement [220] */
+ case 1:
+ noreturn();
+ case 2:
+ noreturn_attr_comma();
+ case 3:
+ noreturn_attr_attr();
+ case 4:
+ return;
+ }
+}
diff --git a/usr.bin/xlint/lint1/msg_221.c b/usr.bin/xlint/lint1/msg_221.c
index fa1d7593c9e9..7e6281f04160 100644
--- a/usr.bin/xlint/lint1/msg_221.c
+++ b/usr.bin/xlint/lint1/msg_221.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_221.c,v 1.6 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_221.c,v 1.7 2024/06/08 06:37:06 rillig Exp $ */
# 3 "msg_221.c"
-// Test for message: initialization of unsigned with negative constant [221]
+// Test for message: initialization of unsigned type '%s' with negative constant %lld [221]
/* lint1-extra-flags: -X 351 */
@@ -9,7 +9,7 @@ struct example {
unsigned int a: 5;
unsigned int b: 5;
} example_var = {
- /* expect+1: warning: initialization of unsigned with negative constant [221] */
+ /* expect+1: warning: initialization of unsigned type 'unsigned int:5' with negative constant -1 [221] */
-1,
31
};
diff --git a/usr.bin/xlint/lint1/msg_222.c b/usr.bin/xlint/lint1/msg_222.c
index 8aee43b13ece..e5b633240e36 100644
--- a/usr.bin/xlint/lint1/msg_222.c
+++ b/usr.bin/xlint/lint1/msg_222.c
@@ -1,33 +1,105 @@
-/* $NetBSD: msg_222.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_222.c,v 1.8 2024/12/15 07:43:53 rillig Exp $ */
# 3 "msg_222.c"
-// Test for message: conversion of negative constant to unsigned type [222]
+// Test for message: conversion of negative constant %lld to unsigned type '%s' [222]
+//
+// See also:
+// msg_162.c: comparison of unsigned type with negative constant
+// msg_164.c: assignment of negative constant to unsigned type
+// msg_221.c: initialization of unsigned type with negative constant
+// msg_296.c: conversion of negative constant to unsigned type in call
/* lint1-extra-flags: -X 351 */
-/* expect+1: warning: initialization of unsigned with negative constant [221] */
-unsigned int global = -1;
+unsigned int u32;
+signed char sc;
+unsigned char uc;
+_Bool b;
-void take_unsigned_int(unsigned int);
void
-function(void)
+convert_negative_constant(void)
{
- /* expect+1: warning: initialization of unsigned with negative constant [221] */
- unsigned int local = -1;
+ u32 = !-8;
+ u32 = ~-8;
+ /* expect+1: warning: assignment of negative constant -8 to unsigned type 'unsigned int' [164] */
+ u32 = +-8;
+ u32 = - -8;
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
- take_unsigned_int(-1);
-
- if (local & -1)
- return;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = u32 * -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = -8 * u32;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = u32 / -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = -8 / u32;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = u32 % -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = -8 / u32;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = u32 + -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = -8 + u32;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = u32 - -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 = -8 - u32;
+ /* expect+1: warning: negative shift [121] */
+ u32 = u32 << -8;
+ u32 = -8 << u32;
+ /* expect+1: warning: negative shift [121] */
+ u32 = u32 >> -8;
+ u32 = -8 >> u32;
/* expect+1: warning: operator '<' compares 'unsigned int' with 'negative constant' [162] */
- if (local < -1)
- return;
+ b = u32 < -8;
+ /* expect+1: warning: operator '<=' compares 'unsigned int' with 'negative constant' [162] */
+ b = u32 <= -8;
+ /* expect+1: warning: operator '>' compares 'unsigned int' with 'negative constant' [162] */
+ b = u32 > -8;
+ /* expect+1: warning: operator '>=' compares 'unsigned int' with 'negative constant' [162] */
+ b = u32 >= -8;
+ /* expect+1: warning: operator '==' compares 'unsigned int' with 'negative constant' [162] */
+ b = u32 == -8;
+ /* expect+1: warning: operator '!=' compares 'unsigned int' with 'negative constant' [162] */
+ b = u32 != -8;
+
+ u32 = u32 & -8;
+ u32 = u32 ^ -8;
+ u32 = u32 | -8;
+ b = u32 && -8;
+ b = u32 || -8;
+
+ /* expect+1: warning: assignment of negative constant -8 to unsigned type 'unsigned int' [164] */
+ u32 = -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 *= -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 /= -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 %= -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 += -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 -= -8;
+ // XXX: missing 'negative shift' warning
+ u32 <<= -8;
+ // XXX: missing 'negative shift' warning
+ u32 >>= -8;
+ u32 &= -8;
+ /* expect+1: warning: conversion of negative constant -8 to unsigned type 'unsigned int' [222] */
+ u32 ^= -8;
+ u32 |= -8;
- local &= -1;
+ sc += 'A' - 'a';
+ sc -= 'A' - 'a';
- /* expect+1: warning: conversion of negative constant to unsigned type [222] */
- local += -1;
+ // XXX: It's perfectly fine to effectively subtract a constant from
+ // XXX: an unsigned type.
+ /* expect+1: warning: conversion of negative constant -32 to unsigned type 'unsigned char' [222] */
+ uc += 'A' - 'a';
+ /* expect+1: warning: conversion of negative constant -32 to unsigned type 'unsigned char' [222] */
+ uc -= 'A' - 'a';
}
diff --git a/usr.bin/xlint/lint1/msg_231.c b/usr.bin/xlint/lint1/msg_231.c
index a7ae5c45f349..190c9f2874a0 100644
--- a/usr.bin/xlint/lint1/msg_231.c
+++ b/usr.bin/xlint/lint1/msg_231.c
@@ -1,14 +1,31 @@
-/* $NetBSD: msg_231.c,v 1.6 2023/07/09 11:18:55 rillig Exp $ */
+/* $NetBSD: msg_231.c,v 1.9 2024/09/28 15:51:40 rillig Exp $ */
# 3 "msg_231.c"
// Test for message: parameter '%s' unused in function '%s' [231]
+//
+// See also:
+// msg_192 for unused local variables
/* lint1-extra-flags: -X 351 */
-/* expect+2: warning: parameter 'param' unused in function 'example' [231] */
void
-example(int param)
+example(
+ /* expect+1: warning: parameter 'param_scalar' unused in function 'example' [231] */
+ int param_scalar,
+ /* expect+1: warning: parameter 'param_ptr' unused in function 'example' [231] */
+ char *param_ptr,
+ /* expect+1: warning: parameter 'param_arr' unused in function 'example' [231] */
+ char param_arr[5],
+ /* expect+1: warning: parameter 'param_func' unused in function 'example' [231] */
+ void (*param_func)(int, double),
+ /* expect+1: warning: parameter 'param_signal' unused in function 'example' [231] */
+ void (*param_signal(int sig, void (*handler)(int)))(int),
+
+ int param_scalar_attr __attribute__((__unused__)),
+ char *param_ptr_attr __attribute__((__unused__)),
+ char param_arr_attr[5] __attribute__((__unused__)),
+ void (*param_func_attr)(int, double) __attribute__((__unused__)),
+ void (*param_signal_attr(int sig, void (*handler)(int)))(int) __attribute__((__unused__))
+)
{
- /* expect+1: warning: 'local' unused in function 'example' [192] */
- int local;
}
diff --git a/usr.bin/xlint/lint1/msg_236.c b/usr.bin/xlint/lint1/msg_236.c
index 392560065575..d09ae7f8dc28 100644
--- a/usr.bin/xlint/lint1/msg_236.c
+++ b/usr.bin/xlint/lint1/msg_236.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_236.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_236.c,v 1.7 2024/09/28 16:09:23 rillig Exp $ */
# 3 "msg_236.c"
// Test for message: static function '%s' unused [236]
@@ -20,3 +20,9 @@ static inline void
inline_function(void)
{
}
+
+__attribute__((__constructor__))
+static void
+constructor_function(void)
+{
+}
diff --git a/usr.bin/xlint/lint1/msg_238.c b/usr.bin/xlint/lint1/msg_238.c
index 99bad647a154..dae9726f1396 100644
--- a/usr.bin/xlint/lint1/msg_238.c
+++ b/usr.bin/xlint/lint1/msg_238.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_238.c,v 1.6 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_238.c,v 1.8 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_238.c"
-/* Test for message: initialization of union is illegal in traditional C [238] */
+/* Test for message: initialization of union requires C90 or later [238] */
/* lint1-flags: -tw -X 351 */
@@ -13,7 +13,7 @@ struct {
union {
int x;
-/* expect+1: warning: initialization of union is illegal in traditional C [238] */
+/* expect+1: warning: initialization of union requires C90 or later [238] */
} u = {
3
};
diff --git a/usr.bin/xlint/lint1/msg_239.c b/usr.bin/xlint/lint1/msg_239.c
index a879f46aafb7..8bbb663017ba 100644
--- a/usr.bin/xlint/lint1/msg_239.c
+++ b/usr.bin/xlint/lint1/msg_239.c
@@ -1,7 +1,10 @@
-/* $NetBSD: msg_239.c,v 1.8 2023/08/02 18:51:25 rillig Exp $ */
+/* $NetBSD: msg_239.c,v 1.10 2025/04/10 20:16:30 rillig Exp $ */
# 3 "msg_239.c"
// Test for message: constant operand to '!' [239]
+// This message is not used.
+// Its purpose is unclear, as a constant condition is not a bug by itself.
+// See msg_382.c for a similar pattern that catches real bugs.
/* lint1-extra-flags: -h -X 351 */
@@ -10,11 +13,9 @@ example(int n)
{
_Bool b;
- /* expect+2: warning: constant in conditional context [161] */
- /* expect+1: warning: constant operand to '!' [239] */
+ /* was: warning: constant operand to '!' [239] */
b = !0;
- /* expect+2: warning: constant in conditional context [161] */
- /* expect+1: warning: constant operand to '!' [239] */
+ /* was: warning: constant operand to '!' [239] */
b = !1;
b = !(n > 1);
diff --git a/usr.bin/xlint/lint1/msg_244.c b/usr.bin/xlint/lint1/msg_244.c
index 8b015b7788fc..0a738bac2e62 100644
--- a/usr.bin/xlint/lint1/msg_244.c
+++ b/usr.bin/xlint/lint1/msg_244.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_244.c,v 1.4 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_244.c,v 1.5 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_244.c"
-// Test for message: illegal structure pointer combination [244]
+// Test for message: invalid structure pointer combination [244]
/* lint1-extra-flags: -X 351 */
@@ -16,7 +16,7 @@ struct b {
int
diff(struct a *a, struct b *b)
{
- /* expect+1: error: illegal pointer subtraction [116] */
+ /* expect+1: error: invalid pointer subtraction [116] */
return a - b;
}
@@ -30,6 +30,6 @@ lt(struct a *a, struct b *b)
struct a *
ret(struct b *b)
{
- /* expect+1: warning: illegal structure pointer combination [244] */
+ /* expect+1: warning: invalid structure pointer combination [244] */
return b;
}
diff --git a/usr.bin/xlint/lint1/msg_246.c b/usr.bin/xlint/lint1/msg_246.c
index d102238fc039..3cc85c7bbbfc 100644
--- a/usr.bin/xlint/lint1/msg_246.c
+++ b/usr.bin/xlint/lint1/msg_246.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_246.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_246.c,v 1.7 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_246.c"
// Test for message: dubious conversion of enum to '%s' [246]
@@ -19,6 +19,6 @@ to_double(enum color c)
void *
to_pointer(enum color c)
{
- /* expect+1: warning: illegal combination of pointer 'pointer to void' and integer 'enum color' [183] */
+ /* expect+1: warning: invalid combination of pointer 'pointer to void' and integer 'enum color' for 'return' [183] */
return c;
}
diff --git a/usr.bin/xlint/lint1/msg_247.c b/usr.bin/xlint/lint1/msg_247.c
index c183ef782969..43e279272997 100644
--- a/usr.bin/xlint/lint1/msg_247.c
+++ b/usr.bin/xlint/lint1/msg_247.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_247.c,v 1.33 2023/08/07 22:30:39 rillig Exp $ */
+/* $NetBSD: msg_247.c,v 1.35 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_247.c"
-// Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
+// Test for message: pointer cast from '%s' to unrelated '%s' [247]
//
// The word 'may' in the message text means that the trouble is not necessarily
@@ -78,7 +78,7 @@ cast_to_unsigned_char_pointer(struct Other *arg)
signed char *
cast_to_signed_char_pointer(struct Other *arg)
{
- /* expect+1: warning: pointer cast from 'pointer to struct Other' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct Other' to unrelated 'signed char' [247] */
return (signed char *)arg;
}
@@ -224,7 +224,7 @@ char_to_struct(void *ptr)
sink((struct counter *)(unsigned char *)ptr);
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct counter' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct counter' [247] */
sink((struct counter *)(signed char *)ptr);
}
@@ -284,10 +284,10 @@ cast_between_sockaddr_variants(void *ptr)
void *t3 = (struct sockaddr_in6 *)(struct sockaddr *)t2;
void *t4 = (struct sockaddr *)(struct sockaddr_in6 *)t3;
- /* expect+1: warning: pointer cast from 'pointer to struct sockaddr_in6' to 'pointer to struct sockaddr_in' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct sockaddr_in6' to unrelated 'struct sockaddr_in' [247] */
void *t5 = (struct sockaddr_in *)(struct sockaddr_in6 *)t4;
- /* expect+1: warning: pointer cast from 'pointer to struct sockaddr_in' to 'pointer to struct sockaddr_in6' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct sockaddr_in' to unrelated 'struct sockaddr_in6' [247] */
void *t6 = (struct sockaddr_in6 *)(struct sockaddr_in *)t5;
return t6;
@@ -330,7 +330,7 @@ unnecessary_cast_from_array_to_pointer(int dim)
return storage_1d;
if (dim == 2)
- /* expect+1: warning: illegal combination of 'pointer to double' and 'pointer to array[5] of double' [184] */
+ /* expect+1: warning: invalid combination of 'pointer to double' and 'pointer to array[5] of double' [184] */
return storage_2d;
/*
@@ -371,16 +371,16 @@ conversions_from_and_to_union(void)
/* Self-assignment, disguised by a cast to a pointer. */
p_int = (void *)p_int;
- /* expect+1: warning: illegal combination of 'pointer to int' and 'pointer to double', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to int' and 'pointer to double', op '=' [124] */
p_int = p_double;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'int' [247] */
p_int = (int *)p_double;
- /* expect+1: warning: illegal combination of 'pointer to union typedef anything' and 'pointer to double', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to union typedef anything' and 'pointer to double', op '=' [124] */
p_anything = p_double;
/* OK, since the union 'anything' has a 'double' member. */
p_anything = (anything *)p_double;
- /* expect+1: warning: illegal combination of 'pointer to double' and 'pointer to union typedef anything', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to double' and 'pointer to union typedef anything', op '=' [124] */
p_double = p_anything;
/* OK, since the union 'anything' has a 'double' member. */
p_double = (double *)p_anything;
@@ -389,13 +389,13 @@ conversions_from_and_to_union(void)
* Casting to an intermediate union does not make casting between two
* incompatible types better.
*/
- /* expect+1: warning: illegal combination of 'pointer to function(void) returning void' and 'pointer to union typedef anything', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to function(void) returning void' and 'pointer to union typedef anything', op '=' [124] */
p_function = (anything *)p_int;
/* expect+2: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef anything' is questionable [229] */
- /* expect+1: warning: illegal combination of 'pointer to function(void) returning void' and 'pointer to union typedef anything', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to function(void) returning void' and 'pointer to union typedef anything', op '=' [124] */
p_function = (anything *)p_function_array->m_function_array[0];
- /* expect+1: warning: illegal combination of 'pointer to int' and 'pointer to function(void) returning void', op '=' [124] */
+ /* expect+1: warning: invalid combination of 'pointer to int' and 'pointer to function(void) returning void', op '=' [124] */
p_int = p_function;
}
diff --git a/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c b/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c
index 6c545585e544..5d9024c77e70 100644
--- a/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c
+++ b/usr.bin/xlint/lint1/msg_247_ilp32_ldbl64.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_247_ilp32_ldbl64.c,v 1.5 2023/08/07 22:30:39 rillig Exp $ */
+/* $NetBSD: msg_247_ilp32_ldbl64.c,v 1.6 2024/09/28 19:09:37 rillig Exp $ */
# 3 "msg_247_ilp32_ldbl64.c"
-// Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
+// Test for message: pointer cast from '%s' to unrelated '%s' [247]
// In non-portable mode, lint warns based on the actual type sizes.
//
@@ -65,49 +65,49 @@ all_casts(void)
{
bool_ptr = (typeof(bool_ptr))bool_ptr;
bool_ptr = (typeof(bool_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))schar_ptr;
bool_ptr = (typeof(bool_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))lcomplex_ptr;
bool_ptr = (typeof(bool_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to _Bool' is questionable [229] */
bool_ptr = (typeof(bool_ptr))func_ptr;
@@ -140,51 +140,51 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to char' is questionable [229] */
char_ptr = (typeof(char_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))bool_ptr;
schar_ptr = (typeof(schar_ptr))char_ptr;
schar_ptr = (typeof(schar_ptr))schar_ptr;
schar_ptr = (typeof(schar_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))lcomplex_ptr;
schar_ptr = (typeof(schar_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to signed char' is questionable [229] */
schar_ptr = (typeof(schar_ptr))func_ptr;
@@ -217,661 +217,661 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned char' is questionable [229] */
uchar_ptr = (typeof(uchar_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))bool_ptr;
short_ptr = (typeof(short_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))schar_ptr;
short_ptr = (typeof(short_ptr))uchar_ptr;
short_ptr = (typeof(short_ptr))short_ptr;
short_ptr = (typeof(short_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))lcomplex_ptr;
short_ptr = (typeof(short_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to short' is questionable [229] */
short_ptr = (typeof(short_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))bool_ptr;
ushort_ptr = (typeof(ushort_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))schar_ptr;
ushort_ptr = (typeof(ushort_ptr))uchar_ptr;
ushort_ptr = (typeof(ushort_ptr))short_ptr;
ushort_ptr = (typeof(ushort_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))lcomplex_ptr;
ushort_ptr = (typeof(ushort_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned short' is questionable [229] */
ushort_ptr = (typeof(ushort_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))bool_ptr;
int_ptr = (typeof(int_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))schar_ptr;
int_ptr = (typeof(int_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ushort_ptr;
int_ptr = (typeof(int_ptr))int_ptr;
int_ptr = (typeof(int_ptr))uint_ptr;
int_ptr = (typeof(int_ptr))long_ptr;
int_ptr = (typeof(int_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))lcomplex_ptr;
int_ptr = (typeof(int_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_union_ptr;
int_ptr = (typeof(int_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to int' is questionable [229] */
int_ptr = (typeof(int_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))bool_ptr;
uint_ptr = (typeof(uint_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))schar_ptr;
uint_ptr = (typeof(uint_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ushort_ptr;
uint_ptr = (typeof(uint_ptr))int_ptr;
uint_ptr = (typeof(uint_ptr))uint_ptr;
uint_ptr = (typeof(uint_ptr))long_ptr;
uint_ptr = (typeof(uint_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))lcomplex_ptr;
uint_ptr = (typeof(uint_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_union_ptr;
uint_ptr = (typeof(uint_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned int' is questionable [229] */
uint_ptr = (typeof(uint_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))bool_ptr;
long_ptr = (typeof(long_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))schar_ptr;
long_ptr = (typeof(long_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ushort_ptr;
long_ptr = (typeof(long_ptr))int_ptr;
long_ptr = (typeof(long_ptr))uint_ptr;
long_ptr = (typeof(long_ptr))long_ptr;
long_ptr = (typeof(long_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))lcomplex_ptr;
long_ptr = (typeof(long_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_union_ptr;
long_ptr = (typeof(long_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long' is questionable [229] */
long_ptr = (typeof(long_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))bool_ptr;
ulong_ptr = (typeof(ulong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))schar_ptr;
ulong_ptr = (typeof(ulong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ushort_ptr;
ulong_ptr = (typeof(ulong_ptr))int_ptr;
ulong_ptr = (typeof(ulong_ptr))uint_ptr;
ulong_ptr = (typeof(ulong_ptr))long_ptr;
ulong_ptr = (typeof(ulong_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))lcomplex_ptr;
ulong_ptr = (typeof(ulong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_union_ptr;
ulong_ptr = (typeof(ulong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long' is questionable [229] */
ulong_ptr = (typeof(ulong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))bool_ptr;
llong_ptr = (typeof(llong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))schar_ptr;
llong_ptr = (typeof(llong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ulong_ptr;
llong_ptr = (typeof(llong_ptr))llong_ptr;
llong_ptr = (typeof(llong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))lcomplex_ptr;
llong_ptr = (typeof(llong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long long' is questionable [229] */
llong_ptr = (typeof(llong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))bool_ptr;
ullong_ptr = (typeof(ullong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))schar_ptr;
ullong_ptr = (typeof(ullong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ulong_ptr;
ullong_ptr = (typeof(ullong_ptr))llong_ptr;
ullong_ptr = (typeof(ullong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))lcomplex_ptr;
ullong_ptr = (typeof(ullong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long long' is questionable [229] */
ullong_ptr = (typeof(ullong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))bool_ptr;
float_ptr = (typeof(float_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))schar_ptr;
float_ptr = (typeof(float_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ullong_ptr;
float_ptr = (typeof(float_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))lcomplex_ptr;
float_ptr = (typeof(float_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float' is questionable [229] */
float_ptr = (typeof(float_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))bool_ptr;
double_ptr = (typeof(double_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))schar_ptr;
double_ptr = (typeof(double_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))float_ptr;
double_ptr = (typeof(double_ptr))double_ptr;
double_ptr = (typeof(double_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))lcomplex_ptr;
double_ptr = (typeof(double_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_union_ptr;
double_ptr = (typeof(double_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))enum_ptr;
double_ptr = (typeof(double_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double' is questionable [229] */
double_ptr = (typeof(double_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))bool_ptr;
ldouble_ptr = (typeof(ldouble_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))schar_ptr;
ldouble_ptr = (typeof(ldouble_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))float_ptr;
ldouble_ptr = (typeof(ldouble_ptr))double_ptr;
ldouble_ptr = (typeof(ldouble_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))lcomplex_ptr;
ldouble_ptr = (typeof(ldouble_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))enum_ptr;
ldouble_ptr = (typeof(ldouble_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double' is questionable [229] */
ldouble_ptr = (typeof(ldouble_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))bool_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))schar_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ldouble_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))lcomplex_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float _Complex' is questionable [229] */
fcomplex_ptr = (typeof(fcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))bool_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))schar_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))fcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))dcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))lcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double _Complex' is questionable [229] */
dcomplex_ptr = (typeof(dcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))bool_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))schar_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))fcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))dcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))lcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double _Complex' is questionable [229] */
lcomplex_ptr = (typeof(lcomplex_ptr))func_ptr;
@@ -903,286 +903,286 @@ all_casts(void)
void_ptr = (typeof(void_ptr))double_array_ptr;
void_ptr = (typeof(void_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))bool_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))schar_ptr;
char_struct_ptr = (typeof(char_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))lcomplex_ptr;
char_struct_ptr = (typeof(char_struct_ptr))void_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef char_struct' is questionable [229] */
char_struct_ptr = (typeof(char_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))bool_ptr;
double_struct_ptr = (typeof(double_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))schar_ptr;
double_struct_ptr = (typeof(double_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))lcomplex_ptr;
double_struct_ptr = (typeof(double_struct_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_struct_ptr;
double_struct_ptr = (typeof(double_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef double_struct' is questionable [229] */
double_struct_ptr = (typeof(double_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))bool_ptr;
char_union_ptr = (typeof(char_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))schar_ptr;
char_union_ptr = (typeof(char_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))lcomplex_ptr;
char_union_ptr = (typeof(char_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_struct_ptr;
char_union_ptr = (typeof(char_union_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef char_union' is questionable [229] */
char_union_ptr = (typeof(char_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))bool_ptr;
double_union_ptr = (typeof(double_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))schar_ptr;
double_union_ptr = (typeof(double_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))float_ptr;
double_union_ptr = (typeof(double_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))lcomplex_ptr;
double_union_ptr = (typeof(double_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_union_ptr;
double_union_ptr = (typeof(double_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))enum_ptr;
double_union_ptr = (typeof(double_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef double_union' is questionable [229] */
double_union_ptr = (typeof(double_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))bool_ptr;
enum_ptr = (typeof(enum_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))schar_ptr;
enum_ptr = (typeof(enum_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ushort_ptr;
enum_ptr = (typeof(enum_ptr))int_ptr;
enum_ptr = (typeof(enum_ptr))uint_ptr;
enum_ptr = (typeof(enum_ptr))long_ptr;
enum_ptr = (typeof(enum_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))lcomplex_ptr;
enum_ptr = (typeof(enum_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_union_ptr;
enum_ptr = (typeof(enum_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to enum typedef int_enum' is questionable [229] */
enum_ptr = (typeof(enum_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))bool_ptr;
double_array_ptr = (typeof(double_array_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))schar_ptr;
double_array_ptr = (typeof(double_array_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))float_ptr;
double_array_ptr = (typeof(double_array_ptr))double_ptr;
double_array_ptr = (typeof(double_array_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))lcomplex_ptr;
double_array_ptr = (typeof(double_array_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_union_ptr;
double_array_ptr = (typeof(double_array_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))enum_ptr;
double_array_ptr = (typeof(double_array_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to array[5] of double' is questionable [229] */
diff --git a/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c b/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c
index 8aadbaf2af46..4205a4e3702b 100644
--- a/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c
+++ b/usr.bin/xlint/lint1/msg_247_lp64_ldbl128.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_247_lp64_ldbl128.c,v 1.5 2023/08/07 22:30:39 rillig Exp $ */
+/* $NetBSD: msg_247_lp64_ldbl128.c,v 1.6 2024/09/28 19:09:37 rillig Exp $ */
# 3 "msg_247_lp64_ldbl128.c"
-// Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
+// Test for message: pointer cast from '%s' to unrelated '%s' [247]
// In non-portable mode, lint warns based on the actual type sizes.
//
@@ -65,49 +65,49 @@ all_casts(void)
{
bool_ptr = (typeof(bool_ptr))bool_ptr;
bool_ptr = (typeof(bool_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))schar_ptr;
bool_ptr = (typeof(bool_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))lcomplex_ptr;
bool_ptr = (typeof(bool_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to _Bool' is questionable [229] */
bool_ptr = (typeof(bool_ptr))func_ptr;
@@ -140,51 +140,51 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to char' is questionable [229] */
char_ptr = (typeof(char_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))bool_ptr;
schar_ptr = (typeof(schar_ptr))char_ptr;
schar_ptr = (typeof(schar_ptr))schar_ptr;
schar_ptr = (typeof(schar_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))lcomplex_ptr;
schar_ptr = (typeof(schar_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to signed char' is questionable [229] */
schar_ptr = (typeof(schar_ptr))func_ptr;
@@ -217,668 +217,668 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned char' is questionable [229] */
uchar_ptr = (typeof(uchar_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))bool_ptr;
short_ptr = (typeof(short_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))schar_ptr;
short_ptr = (typeof(short_ptr))uchar_ptr;
short_ptr = (typeof(short_ptr))short_ptr;
short_ptr = (typeof(short_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))lcomplex_ptr;
short_ptr = (typeof(short_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to short' is questionable [229] */
short_ptr = (typeof(short_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))bool_ptr;
ushort_ptr = (typeof(ushort_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))schar_ptr;
ushort_ptr = (typeof(ushort_ptr))uchar_ptr;
ushort_ptr = (typeof(ushort_ptr))short_ptr;
ushort_ptr = (typeof(ushort_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))lcomplex_ptr;
ushort_ptr = (typeof(ushort_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned short' is questionable [229] */
ushort_ptr = (typeof(ushort_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))bool_ptr;
int_ptr = (typeof(int_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))schar_ptr;
int_ptr = (typeof(int_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ushort_ptr;
int_ptr = (typeof(int_ptr))int_ptr;
int_ptr = (typeof(int_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))lcomplex_ptr;
int_ptr = (typeof(int_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_union_ptr;
int_ptr = (typeof(int_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to int' is questionable [229] */
int_ptr = (typeof(int_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))bool_ptr;
uint_ptr = (typeof(uint_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))schar_ptr;
uint_ptr = (typeof(uint_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ushort_ptr;
uint_ptr = (typeof(uint_ptr))int_ptr;
uint_ptr = (typeof(uint_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))lcomplex_ptr;
uint_ptr = (typeof(uint_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_union_ptr;
uint_ptr = (typeof(uint_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned int' is questionable [229] */
uint_ptr = (typeof(uint_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))bool_ptr;
long_ptr = (typeof(long_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))schar_ptr;
long_ptr = (typeof(long_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))uint_ptr;
long_ptr = (typeof(long_ptr))long_ptr;
long_ptr = (typeof(long_ptr))ulong_ptr;
long_ptr = (typeof(long_ptr))llong_ptr;
long_ptr = (typeof(long_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))lcomplex_ptr;
long_ptr = (typeof(long_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long' is questionable [229] */
long_ptr = (typeof(long_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))bool_ptr;
ulong_ptr = (typeof(ulong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))schar_ptr;
ulong_ptr = (typeof(ulong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))uint_ptr;
ulong_ptr = (typeof(ulong_ptr))long_ptr;
ulong_ptr = (typeof(ulong_ptr))ulong_ptr;
ulong_ptr = (typeof(ulong_ptr))llong_ptr;
ulong_ptr = (typeof(ulong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))lcomplex_ptr;
ulong_ptr = (typeof(ulong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long' is questionable [229] */
ulong_ptr = (typeof(ulong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))bool_ptr;
llong_ptr = (typeof(llong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))schar_ptr;
llong_ptr = (typeof(llong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))uint_ptr;
llong_ptr = (typeof(llong_ptr))long_ptr;
llong_ptr = (typeof(llong_ptr))ulong_ptr;
llong_ptr = (typeof(llong_ptr))llong_ptr;
llong_ptr = (typeof(llong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))lcomplex_ptr;
llong_ptr = (typeof(llong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long long' is questionable [229] */
llong_ptr = (typeof(llong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))bool_ptr;
ullong_ptr = (typeof(ullong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))schar_ptr;
ullong_ptr = (typeof(ullong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))uint_ptr;
ullong_ptr = (typeof(ullong_ptr))long_ptr;
ullong_ptr = (typeof(ullong_ptr))ulong_ptr;
ullong_ptr = (typeof(ullong_ptr))llong_ptr;
ullong_ptr = (typeof(ullong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))lcomplex_ptr;
ullong_ptr = (typeof(ullong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long long' is questionable [229] */
ullong_ptr = (typeof(ullong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))bool_ptr;
float_ptr = (typeof(float_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))schar_ptr;
float_ptr = (typeof(float_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ullong_ptr;
float_ptr = (typeof(float_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))lcomplex_ptr;
float_ptr = (typeof(float_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float' is questionable [229] */
float_ptr = (typeof(float_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))bool_ptr;
double_ptr = (typeof(double_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))schar_ptr;
double_ptr = (typeof(double_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))float_ptr;
double_ptr = (typeof(double_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))lcomplex_ptr;
double_ptr = (typeof(double_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_union_ptr;
double_ptr = (typeof(double_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))enum_ptr;
double_ptr = (typeof(double_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double' is questionable [229] */
double_ptr = (typeof(double_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))bool_ptr;
ldouble_ptr = (typeof(ldouble_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))schar_ptr;
ldouble_ptr = (typeof(ldouble_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_ptr;
ldouble_ptr = (typeof(ldouble_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))lcomplex_ptr;
ldouble_ptr = (typeof(ldouble_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double' is questionable [229] */
ldouble_ptr = (typeof(ldouble_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))bool_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))schar_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ldouble_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))lcomplex_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float _Complex' is questionable [229] */
fcomplex_ptr = (typeof(fcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))bool_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))schar_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))fcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))lcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double _Complex' is questionable [229] */
dcomplex_ptr = (typeof(dcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))bool_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))schar_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))dcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))lcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double _Complex' is questionable [229] */
lcomplex_ptr = (typeof(lcomplex_ptr))func_ptr;
@@ -910,289 +910,289 @@ all_casts(void)
void_ptr = (typeof(void_ptr))double_array_ptr;
void_ptr = (typeof(void_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))bool_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))schar_ptr;
char_struct_ptr = (typeof(char_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))lcomplex_ptr;
char_struct_ptr = (typeof(char_struct_ptr))void_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef char_struct' is questionable [229] */
char_struct_ptr = (typeof(char_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))bool_ptr;
double_struct_ptr = (typeof(double_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))schar_ptr;
double_struct_ptr = (typeof(double_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))lcomplex_ptr;
double_struct_ptr = (typeof(double_struct_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_struct_ptr;
double_struct_ptr = (typeof(double_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef double_struct' is questionable [229] */
double_struct_ptr = (typeof(double_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))bool_ptr;
char_union_ptr = (typeof(char_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))schar_ptr;
char_union_ptr = (typeof(char_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))lcomplex_ptr;
char_union_ptr = (typeof(char_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_struct_ptr;
char_union_ptr = (typeof(char_union_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef char_union' is questionable [229] */
char_union_ptr = (typeof(char_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))bool_ptr;
double_union_ptr = (typeof(double_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))schar_ptr;
double_union_ptr = (typeof(double_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))float_ptr;
double_union_ptr = (typeof(double_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))lcomplex_ptr;
double_union_ptr = (typeof(double_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_union_ptr;
double_union_ptr = (typeof(double_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))enum_ptr;
double_union_ptr = (typeof(double_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef double_union' is questionable [229] */
double_union_ptr = (typeof(double_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))bool_ptr;
enum_ptr = (typeof(enum_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))schar_ptr;
enum_ptr = (typeof(enum_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ushort_ptr;
enum_ptr = (typeof(enum_ptr))int_ptr;
enum_ptr = (typeof(enum_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))lcomplex_ptr;
enum_ptr = (typeof(enum_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_union_ptr;
enum_ptr = (typeof(enum_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to enum typedef int_enum' is questionable [229] */
enum_ptr = (typeof(enum_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))bool_ptr;
double_array_ptr = (typeof(double_array_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))schar_ptr;
double_array_ptr = (typeof(double_array_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))float_ptr;
double_array_ptr = (typeof(double_array_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))lcomplex_ptr;
double_array_ptr = (typeof(double_array_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_union_ptr;
double_array_ptr = (typeof(double_array_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))enum_ptr;
double_array_ptr = (typeof(double_array_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to array[5] of double' is questionable [229] */
diff --git a/usr.bin/xlint/lint1/msg_247_portable.c b/usr.bin/xlint/lint1/msg_247_portable.c
index 066b4363c787..f71d38ba3231 100644
--- a/usr.bin/xlint/lint1/msg_247_portable.c
+++ b/usr.bin/xlint/lint1/msg_247_portable.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_247_portable.c,v 1.5 2023/08/07 22:30:39 rillig Exp $ */
+/* $NetBSD: msg_247_portable.c,v 1.6 2024/09/28 19:09:37 rillig Exp $ */
# 3 "msg_247_portable.c"
-// Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
+// Test for message: pointer cast from '%s' to unrelated '%s' [247]
// In portable mode on platforms where 'ptrdiff_t' is 'long', lint defines the
// rank of the integer types such that _Bool < char < short < int < long <
@@ -68,49 +68,49 @@ all_casts(void)
{
bool_ptr = (typeof(bool_ptr))bool_ptr;
bool_ptr = (typeof(bool_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))schar_ptr;
bool_ptr = (typeof(bool_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))lcomplex_ptr;
bool_ptr = (typeof(bool_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to _Bool' is questionable [229] */
bool_ptr = (typeof(bool_ptr))func_ptr;
@@ -143,51 +143,51 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to char' is questionable [229] */
char_ptr = (typeof(char_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))bool_ptr;
schar_ptr = (typeof(schar_ptr))char_ptr;
schar_ptr = (typeof(schar_ptr))schar_ptr;
schar_ptr = (typeof(schar_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))lcomplex_ptr;
schar_ptr = (typeof(schar_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to signed char' is questionable [229] */
schar_ptr = (typeof(schar_ptr))func_ptr;
@@ -220,676 +220,676 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned char' is questionable [229] */
uchar_ptr = (typeof(uchar_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))bool_ptr;
short_ptr = (typeof(short_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))schar_ptr;
short_ptr = (typeof(short_ptr))uchar_ptr;
short_ptr = (typeof(short_ptr))short_ptr;
short_ptr = (typeof(short_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))lcomplex_ptr;
short_ptr = (typeof(short_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to short' is questionable [229] */
short_ptr = (typeof(short_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))bool_ptr;
ushort_ptr = (typeof(ushort_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))schar_ptr;
ushort_ptr = (typeof(ushort_ptr))uchar_ptr;
ushort_ptr = (typeof(ushort_ptr))short_ptr;
ushort_ptr = (typeof(ushort_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))lcomplex_ptr;
ushort_ptr = (typeof(ushort_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned short' is questionable [229] */
ushort_ptr = (typeof(ushort_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))bool_ptr;
int_ptr = (typeof(int_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))schar_ptr;
int_ptr = (typeof(int_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ushort_ptr;
int_ptr = (typeof(int_ptr))int_ptr;
int_ptr = (typeof(int_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))lcomplex_ptr;
int_ptr = (typeof(int_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_union_ptr;
int_ptr = (typeof(int_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to int' is questionable [229] */
int_ptr = (typeof(int_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))bool_ptr;
uint_ptr = (typeof(uint_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))schar_ptr;
uint_ptr = (typeof(uint_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ushort_ptr;
uint_ptr = (typeof(uint_ptr))int_ptr;
uint_ptr = (typeof(uint_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))lcomplex_ptr;
uint_ptr = (typeof(uint_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_union_ptr;
uint_ptr = (typeof(uint_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned int' is questionable [229] */
uint_ptr = (typeof(uint_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))bool_ptr;
long_ptr = (typeof(long_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))schar_ptr;
long_ptr = (typeof(long_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))uint_ptr;
long_ptr = (typeof(long_ptr))long_ptr;
long_ptr = (typeof(long_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))lcomplex_ptr;
long_ptr = (typeof(long_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long' is questionable [229] */
long_ptr = (typeof(long_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))bool_ptr;
ulong_ptr = (typeof(ulong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))schar_ptr;
ulong_ptr = (typeof(ulong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))uint_ptr;
ulong_ptr = (typeof(ulong_ptr))long_ptr;
ulong_ptr = (typeof(ulong_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))lcomplex_ptr;
ulong_ptr = (typeof(ulong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long' is questionable [229] */
ulong_ptr = (typeof(ulong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))bool_ptr;
llong_ptr = (typeof(llong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))schar_ptr;
llong_ptr = (typeof(llong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ulong_ptr;
llong_ptr = (typeof(llong_ptr))llong_ptr;
llong_ptr = (typeof(llong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))lcomplex_ptr;
llong_ptr = (typeof(llong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long long' is questionable [229] */
llong_ptr = (typeof(llong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))bool_ptr;
ullong_ptr = (typeof(ullong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))schar_ptr;
ullong_ptr = (typeof(ullong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ulong_ptr;
ullong_ptr = (typeof(ullong_ptr))llong_ptr;
ullong_ptr = (typeof(ullong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))lcomplex_ptr;
ullong_ptr = (typeof(ullong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long long' is questionable [229] */
ullong_ptr = (typeof(ullong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))bool_ptr;
float_ptr = (typeof(float_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))schar_ptr;
float_ptr = (typeof(float_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ullong_ptr;
float_ptr = (typeof(float_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))lcomplex_ptr;
float_ptr = (typeof(float_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float' is questionable [229] */
float_ptr = (typeof(float_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))bool_ptr;
double_ptr = (typeof(double_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))schar_ptr;
double_ptr = (typeof(double_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))float_ptr;
double_ptr = (typeof(double_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))lcomplex_ptr;
double_ptr = (typeof(double_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_union_ptr;
double_ptr = (typeof(double_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))enum_ptr;
double_ptr = (typeof(double_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double' is questionable [229] */
double_ptr = (typeof(double_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))bool_ptr;
ldouble_ptr = (typeof(ldouble_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))schar_ptr;
ldouble_ptr = (typeof(ldouble_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_ptr;
ldouble_ptr = (typeof(ldouble_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))lcomplex_ptr;
ldouble_ptr = (typeof(ldouble_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double' is questionable [229] */
ldouble_ptr = (typeof(ldouble_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))bool_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))schar_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ldouble_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))lcomplex_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float _Complex' is questionable [229] */
fcomplex_ptr = (typeof(fcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))bool_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))schar_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))fcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))lcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double _Complex' is questionable [229] */
dcomplex_ptr = (typeof(dcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))bool_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))schar_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))dcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))lcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double _Complex' is questionable [229] */
lcomplex_ptr = (typeof(lcomplex_ptr))func_ptr;
@@ -921,289 +921,289 @@ all_casts(void)
void_ptr = (typeof(void_ptr))double_array_ptr;
void_ptr = (typeof(void_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))bool_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))schar_ptr;
char_struct_ptr = (typeof(char_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))lcomplex_ptr;
char_struct_ptr = (typeof(char_struct_ptr))void_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef char_struct' is questionable [229] */
char_struct_ptr = (typeof(char_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))bool_ptr;
double_struct_ptr = (typeof(double_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))schar_ptr;
double_struct_ptr = (typeof(double_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))lcomplex_ptr;
double_struct_ptr = (typeof(double_struct_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_struct_ptr;
double_struct_ptr = (typeof(double_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef double_struct' is questionable [229] */
double_struct_ptr = (typeof(double_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))bool_ptr;
char_union_ptr = (typeof(char_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))schar_ptr;
char_union_ptr = (typeof(char_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))lcomplex_ptr;
char_union_ptr = (typeof(char_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_struct_ptr;
char_union_ptr = (typeof(char_union_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef char_union' is questionable [229] */
char_union_ptr = (typeof(char_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))bool_ptr;
double_union_ptr = (typeof(double_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))schar_ptr;
double_union_ptr = (typeof(double_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))float_ptr;
double_union_ptr = (typeof(double_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))lcomplex_ptr;
double_union_ptr = (typeof(double_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_union_ptr;
double_union_ptr = (typeof(double_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))enum_ptr;
double_union_ptr = (typeof(double_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef double_union' is questionable [229] */
double_union_ptr = (typeof(double_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))bool_ptr;
enum_ptr = (typeof(enum_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))schar_ptr;
enum_ptr = (typeof(enum_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ushort_ptr;
enum_ptr = (typeof(enum_ptr))int_ptr;
enum_ptr = (typeof(enum_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))lcomplex_ptr;
enum_ptr = (typeof(enum_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_union_ptr;
enum_ptr = (typeof(enum_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to enum typedef int_enum' is questionable [229] */
enum_ptr = (typeof(enum_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))bool_ptr;
double_array_ptr = (typeof(double_array_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))schar_ptr;
double_array_ptr = (typeof(double_array_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))float_ptr;
double_array_ptr = (typeof(double_array_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))lcomplex_ptr;
double_array_ptr = (typeof(double_array_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_union_ptr;
double_array_ptr = (typeof(double_array_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))enum_ptr;
double_array_ptr = (typeof(double_array_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to array[5] of double' is questionable [229] */
diff --git a/usr.bin/xlint/lint1/msg_247_portable_int.c b/usr.bin/xlint/lint1/msg_247_portable_int.c
index 203b17ddc9fa..545ec0480a9e 100644
--- a/usr.bin/xlint/lint1/msg_247_portable_int.c
+++ b/usr.bin/xlint/lint1/msg_247_portable_int.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_247_portable_int.c,v 1.1 2023/08/07 22:30:39 rillig Exp $ */
+/* $NetBSD: msg_247_portable_int.c,v 1.2 2024/09/28 19:09:37 rillig Exp $ */
# 3 "msg_247_portable_int.c"
-// Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
+// Test for message: pointer cast from '%s' to unrelated '%s' [247]
// In portable mode on platforms where 'ptrdiff_t' is 'int', lint defines the
// rank of the integer types such that _Bool < char < short < int == long <
@@ -73,49 +73,49 @@ all_casts(void)
{
bool_ptr = (typeof(bool_ptr))bool_ptr;
bool_ptr = (typeof(bool_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))schar_ptr;
bool_ptr = (typeof(bool_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))lcomplex_ptr;
bool_ptr = (typeof(bool_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to _Bool' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated '_Bool' [247] */
bool_ptr = (typeof(bool_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to _Bool' is questionable [229] */
bool_ptr = (typeof(bool_ptr))func_ptr;
@@ -148,51 +148,51 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to char' is questionable [229] */
char_ptr = (typeof(char_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))bool_ptr;
schar_ptr = (typeof(schar_ptr))char_ptr;
schar_ptr = (typeof(schar_ptr))schar_ptr;
schar_ptr = (typeof(schar_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))lcomplex_ptr;
schar_ptr = (typeof(schar_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to signed char' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'signed char' [247] */
schar_ptr = (typeof(schar_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to signed char' is questionable [229] */
schar_ptr = (typeof(schar_ptr))func_ptr;
@@ -225,676 +225,676 @@ all_casts(void)
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned char' is questionable [229] */
uchar_ptr = (typeof(uchar_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))bool_ptr;
short_ptr = (typeof(short_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))schar_ptr;
short_ptr = (typeof(short_ptr))uchar_ptr;
short_ptr = (typeof(short_ptr))short_ptr;
short_ptr = (typeof(short_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))lcomplex_ptr;
short_ptr = (typeof(short_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'short' [247] */
short_ptr = (typeof(short_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to short' is questionable [229] */
short_ptr = (typeof(short_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))bool_ptr;
ushort_ptr = (typeof(ushort_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))schar_ptr;
ushort_ptr = (typeof(ushort_ptr))uchar_ptr;
ushort_ptr = (typeof(ushort_ptr))short_ptr;
ushort_ptr = (typeof(ushort_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))lcomplex_ptr;
ushort_ptr = (typeof(ushort_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned short' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned short' [247] */
ushort_ptr = (typeof(ushort_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned short' is questionable [229] */
ushort_ptr = (typeof(ushort_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))bool_ptr;
int_ptr = (typeof(int_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))schar_ptr;
int_ptr = (typeof(int_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ushort_ptr;
int_ptr = (typeof(int_ptr))int_ptr;
int_ptr = (typeof(int_ptr))uint_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to long' to 'pointer to int' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))long_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to int' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'unsigned long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))lcomplex_ptr;
int_ptr = (typeof(int_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_union_ptr;
int_ptr = (typeof(int_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'int' [247] */
int_ptr = (typeof(int_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to int' is questionable [229] */
int_ptr = (typeof(int_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))bool_ptr;
uint_ptr = (typeof(uint_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))schar_ptr;
uint_ptr = (typeof(uint_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ushort_ptr;
uint_ptr = (typeof(uint_ptr))int_ptr;
uint_ptr = (typeof(uint_ptr))uint_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))long_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))lcomplex_ptr;
uint_ptr = (typeof(uint_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_union_ptr;
uint_ptr = (typeof(uint_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned int' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned int' [247] */
uint_ptr = (typeof(uint_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned int' is questionable [229] */
uint_ptr = (typeof(uint_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))bool_ptr;
long_ptr = (typeof(long_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))schar_ptr;
long_ptr = (typeof(long_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ushort_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'int' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))int_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))uint_ptr;
long_ptr = (typeof(long_ptr))long_ptr;
long_ptr = (typeof(long_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))lcomplex_ptr;
long_ptr = (typeof(long_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_union_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long' [247] */
long_ptr = (typeof(long_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long' is questionable [229] */
long_ptr = (typeof(long_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))bool_ptr;
ulong_ptr = (typeof(ulong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))schar_ptr;
ulong_ptr = (typeof(ulong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ushort_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned long' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'int' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))int_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned long' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))uint_ptr;
ulong_ptr = (typeof(ulong_ptr))long_ptr;
ulong_ptr = (typeof(ulong_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))lcomplex_ptr;
ulong_ptr = (typeof(ulong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_union_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long' [247] */
ulong_ptr = (typeof(ulong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long' is questionable [229] */
ulong_ptr = (typeof(ulong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))bool_ptr;
llong_ptr = (typeof(llong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))schar_ptr;
llong_ptr = (typeof(llong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ulong_ptr;
llong_ptr = (typeof(llong_ptr))llong_ptr;
llong_ptr = (typeof(llong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))lcomplex_ptr;
llong_ptr = (typeof(llong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long long' [247] */
llong_ptr = (typeof(llong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long long' is questionable [229] */
llong_ptr = (typeof(llong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))bool_ptr;
ullong_ptr = (typeof(ullong_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))schar_ptr;
ullong_ptr = (typeof(ullong_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ulong_ptr;
ullong_ptr = (typeof(ullong_ptr))llong_ptr;
ullong_ptr = (typeof(ullong_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))lcomplex_ptr;
ullong_ptr = (typeof(ullong_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to unsigned long long' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'unsigned long long' [247] */
ullong_ptr = (typeof(ullong_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to unsigned long long' is questionable [229] */
ullong_ptr = (typeof(ullong_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))bool_ptr;
float_ptr = (typeof(float_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))schar_ptr;
float_ptr = (typeof(float_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ullong_ptr;
float_ptr = (typeof(float_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))lcomplex_ptr;
float_ptr = (typeof(float_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float' [247] */
float_ptr = (typeof(float_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float' is questionable [229] */
float_ptr = (typeof(float_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))bool_ptr;
double_ptr = (typeof(double_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))schar_ptr;
double_ptr = (typeof(double_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))float_ptr;
double_ptr = (typeof(double_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))lcomplex_ptr;
double_ptr = (typeof(double_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))char_union_ptr;
double_ptr = (typeof(double_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double' [247] */
double_ptr = (typeof(double_ptr))enum_ptr;
double_ptr = (typeof(double_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double' is questionable [229] */
double_ptr = (typeof(double_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))bool_ptr;
ldouble_ptr = (typeof(ldouble_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))schar_ptr;
ldouble_ptr = (typeof(ldouble_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_ptr;
ldouble_ptr = (typeof(ldouble_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))lcomplex_ptr;
ldouble_ptr = (typeof(ldouble_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long double' [247] */
ldouble_ptr = (typeof(ldouble_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double' is questionable [229] */
ldouble_ptr = (typeof(ldouble_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))bool_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))schar_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))ldouble_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))lcomplex_ptr;
fcomplex_ptr = (typeof(fcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to float _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'float _Complex' [247] */
fcomplex_ptr = (typeof(fcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to float _Complex' is questionable [229] */
fcomplex_ptr = (typeof(fcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))bool_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))schar_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))fcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))lcomplex_ptr;
dcomplex_ptr = (typeof(dcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'double _Complex' [247] */
dcomplex_ptr = (typeof(dcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to double _Complex' is questionable [229] */
dcomplex_ptr = (typeof(dcomplex_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))bool_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))schar_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))dcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))lcomplex_ptr;
lcomplex_ptr = (typeof(lcomplex_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to long double _Complex' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'long double _Complex' [247] */
lcomplex_ptr = (typeof(lcomplex_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to long double _Complex' is questionable [229] */
lcomplex_ptr = (typeof(lcomplex_ptr))func_ptr;
@@ -926,289 +926,289 @@ all_casts(void)
void_ptr = (typeof(void_ptr))double_array_ptr;
void_ptr = (typeof(void_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))bool_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))schar_ptr;
char_struct_ptr = (typeof(char_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))lcomplex_ptr;
char_struct_ptr = (typeof(char_struct_ptr))void_ptr;
char_struct_ptr = (typeof(char_struct_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef char_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef char_struct' [247] */
char_struct_ptr = (typeof(char_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef char_struct' is questionable [229] */
char_struct_ptr = (typeof(char_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))bool_ptr;
double_struct_ptr = (typeof(double_struct_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))schar_ptr;
double_struct_ptr = (typeof(double_struct_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))lcomplex_ptr;
double_struct_ptr = (typeof(double_struct_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_struct_ptr;
double_struct_ptr = (typeof(double_struct_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to struct typedef double_struct' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'struct typedef double_struct' [247] */
double_struct_ptr = (typeof(double_struct_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to struct typedef double_struct' is questionable [229] */
double_struct_ptr = (typeof(double_struct_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))bool_ptr;
char_union_ptr = (typeof(char_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))schar_ptr;
char_union_ptr = (typeof(char_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))lcomplex_ptr;
char_union_ptr = (typeof(char_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_struct_ptr;
char_union_ptr = (typeof(char_union_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to union typedef char_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'union typedef char_union' [247] */
char_union_ptr = (typeof(char_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef char_union' is questionable [229] */
char_union_ptr = (typeof(char_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))bool_ptr;
double_union_ptr = (typeof(double_union_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))schar_ptr;
double_union_ptr = (typeof(double_union_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))float_ptr;
double_union_ptr = (typeof(double_union_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))lcomplex_ptr;
double_union_ptr = (typeof(double_union_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))char_union_ptr;
double_union_ptr = (typeof(double_union_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to union typedef double_union' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'union typedef double_union' [247] */
double_union_ptr = (typeof(double_union_ptr))enum_ptr;
double_union_ptr = (typeof(double_union_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to union typedef double_union' is questionable [229] */
double_union_ptr = (typeof(double_union_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))bool_ptr;
enum_ptr = (typeof(enum_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))schar_ptr;
enum_ptr = (typeof(enum_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ushort_ptr;
enum_ptr = (typeof(enum_ptr))int_ptr;
enum_ptr = (typeof(enum_ptr))uint_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))long_ptr;
- /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* XXX: only on 'long' platforms: expect+1: warning: pointer cast from 'unsigned long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))float_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))lcomplex_ptr;
enum_ptr = (typeof(enum_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))char_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef double_union' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef double_union' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_union_ptr;
enum_ptr = (typeof(enum_ptr))enum_ptr;
- /* expect+1: warning: pointer cast from 'pointer to array[5] of double' to 'pointer to enum typedef int_enum' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'array[5] of double' to unrelated 'enum typedef int_enum' [247] */
enum_ptr = (typeof(enum_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to enum typedef int_enum' is questionable [229] */
enum_ptr = (typeof(enum_ptr))func_ptr;
- /* expect+1: warning: pointer cast from 'pointer to _Bool' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from '_Bool' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))bool_ptr;
double_array_ptr = (typeof(double_array_ptr))char_ptr;
- /* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'signed char' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))schar_ptr;
double_array_ptr = (typeof(double_array_ptr))uchar_ptr;
- /* expect+1: warning: pointer cast from 'pointer to short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))short_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned short' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned short' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ushort_ptr;
- /* expect+1: warning: pointer cast from 'pointer to int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))int_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned int' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned int' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))uint_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))long_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ulong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))llong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to unsigned long long' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'unsigned long long' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ullong_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))float_ptr;
double_array_ptr = (typeof(double_array_ptr))double_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))ldouble_ptr;
- /* expect+1: warning: pointer cast from 'pointer to float _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'float _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))fcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))dcomplex_ptr;
- /* expect+1: warning: pointer cast from 'pointer to long double _Complex' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'long double _Complex' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))lcomplex_ptr;
double_array_ptr = (typeof(double_array_ptr))void_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef char_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef char_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to struct typedef double_struct' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'struct typedef double_struct' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))double_struct_ptr;
- /* expect+1: warning: pointer cast from 'pointer to union typedef char_union' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'union typedef char_union' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))char_union_ptr;
double_array_ptr = (typeof(double_array_ptr))double_union_ptr;
- /* expect+1: warning: pointer cast from 'pointer to enum typedef int_enum' to 'pointer to array[5] of double' may be troublesome [247] */
+ /* expect+1: warning: pointer cast from 'enum typedef int_enum' to unrelated 'array[5] of double' [247] */
double_array_ptr = (typeof(double_array_ptr))enum_ptr;
double_array_ptr = (typeof(double_array_ptr))double_array_ptr;
/* expect+1: warning: converting 'pointer to function(void) returning void' to 'pointer to array[5] of double' is questionable [229] */
diff --git a/usr.bin/xlint/lint1/msg_249.c b/usr.bin/xlint/lint1/msg_249.c
index 09c51e7fa211..97030d008029 100644
--- a/usr.bin/xlint/lint1/msg_249.c
+++ b/usr.bin/xlint/lint1/msg_249.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_249.c,v 1.14 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_249.c,v 1.16 2024/11/13 04:32:49 rillig Exp $ */
# 3 "msg_249.c"
// Test for message: syntax error '%s' [249]
@@ -30,8 +30,8 @@ int recover_from_rbrace;
void
function(void)
{
- /* expect+2: warning: statement not reached [193] */
if (0)
+ /* expect+1: warning: 'empty' statement not reached [193] */
;
/* expect+1: error: syntax error ')' [249] */
);
@@ -71,9 +71,9 @@ int gcc_statement_expression_1 = ({
unused_label:
1;
1;
+ /* expect+2: error: syntax error 'labels are only valid inside a function' [249] */
+ /* expect+1: error: non-constant initializer [177] */
});
-/* expect-1: error: non-constant initializer [177] */
-/* expect-2: error: syntax error 'labels are only valid inside a function' [249] */
/* Even another function definition does not help. */
void
@@ -85,6 +85,6 @@ int gcc_statement_expression_2 = ({
unused_label:
1;
1;
+ /* expect+2: error: syntax error 'labels are only valid inside a function' [249] */
+ /* expect+1: error: non-constant initializer [177] */
});
-/* expect-1: error: non-constant initializer [177] */
-/* expect-2: error: syntax error 'labels are only valid inside a function' [249] */
diff --git a/usr.bin/xlint/lint1/msg_252.c b/usr.bin/xlint/lint1/msg_252.c
index 37d681441f06..d203f27c7fcc 100644
--- a/usr.bin/xlint/lint1/msg_252.c
+++ b/usr.bin/xlint/lint1/msg_252.c
@@ -1,9 +1,19 @@
-/* $NetBSD: msg_252.c,v 1.6 2023/07/02 18:14:44 rillig Exp $ */
+/* $NetBSD: msg_252.c,v 1.8 2024/06/08 06:42:59 rillig Exp $ */
# 3 "msg_252.c"
// Test for message: integer constant out of range [252]
/*
+ * See also:
+ * platform_ilp32_trad.c
+ * platform_ilp32_c90.c
+ * platform_ilp32_c99.c
+ * platform_lp64_trad.c
+ * platform_lp64_c90.c
+ * platform_lp64_c99.c
+ */
+
+/*
* On ILP32 platforms, lint additionally and unnecessarily warns:
*
* conversion of 'unsigned long' to 'int' is out of range [119]
@@ -23,7 +33,7 @@
* Due to this unnecessary difference, disable this test on ILP32 platforms
* for now (2021-08-28).
*/
-/* lint1-skip-if: ilp32 */
+/* lint1-only-if: lp64 */
/* lint1-extra-flags: -X 351 */
diff --git a/usr.bin/xlint/lint1/msg_253.c b/usr.bin/xlint/lint1/msg_253.c
index 0337d4a0f4a4..492a12ae7d93 100644
--- a/usr.bin/xlint/lint1/msg_253.c
+++ b/usr.bin/xlint/lint1/msg_253.c
@@ -1,8 +1,9 @@
-/* $NetBSD: msg_253.c,v 1.4 2022/06/17 18:54:53 rillig Exp $ */
+/* $NetBSD: msg_253.c,v 1.5 2024/02/02 16:05:37 rillig Exp $ */
# 3 "msg_253.c"
// Test for message: unterminated character constant [253]
+/* expect+4: error: newline in string or char constant [254] */
/* expect+3: error: unterminated character constant [253] */
-/* expect+2: error: syntax error '' [249] */
+/* expect+2: error: syntax error ''' [249] */
'
diff --git a/usr.bin/xlint/lint1/msg_254.c b/usr.bin/xlint/lint1/msg_254.c
index 0b0fe1db58c2..75827a00aa82 100644
--- a/usr.bin/xlint/lint1/msg_254.c
+++ b/usr.bin/xlint/lint1/msg_254.c
@@ -1,19 +1,27 @@
-/* $NetBSD: msg_254.c,v 1.4 2022/06/17 18:54:53 rillig Exp $ */
+/* $NetBSD: msg_254.c,v 1.6 2024/02/02 19:07:58 rillig Exp $ */
# 3 "msg_254.c"
/* Test for message: newline in string or char constant [254] */
-/* lint1-flags: -tw */
+/* lint1-flags: -tw -q17 */
/*
- * The sequence backslash-newline is a GCC extension.
- * C99 does not allow it.
+ * A literal newline must not occur in a character constant or string literal.
*/
-/* expect+6: error: newline in string or char constant [254] */
-/* expect+5: error: unterminated string constant [258] */
-/* expect+4: error: syntax error '"' [249] */
-/* expect+4: error: newline in string or char constant [254] */
-/* expect+3: error: unterminated string constant [258] */
-"line1
-line2"
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated character constant [253] */
+char char_incomplete = 'x
+;
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated string constant [258] */
+char char_string_incomplete[] = "x
+;
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated character constant [253] */
+int wide_incomplete = L'x
+;
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated string constant [258] */
+int wide_string_incomplete[] = L"x
+;
diff --git a/usr.bin/xlint/lint1/msg_255.c b/usr.bin/xlint/lint1/msg_255.c
index 1a7f60f8d7b0..741375b97952 100644
--- a/usr.bin/xlint/lint1/msg_255.c
+++ b/usr.bin/xlint/lint1/msg_255.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_255.c,v 1.6 2023/08/11 04:27:49 rillig Exp $ */
+/* $NetBSD: msg_255.c,v 1.7 2024/12/08 17:12:01 rillig Exp $ */
# 3 "msg_255.c"
// Test for message: undefined or invalid '#' directive [255]
@@ -34,12 +34,13 @@
/* expect+1: warning: undefined or invalid '#' directive [255] */
# 4 /
-/* expect+1: warning: undefined or invalid '#' directive [255] */
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated string constant [258] */
# 5 "unfinished
// An empty string means standard input; tabs may be used for spacing.
# 6 ""
-# 44 "msg_255.c"
+# 45 "msg_255.c"
int dummy;
diff --git a/usr.bin/xlint/lint1/msg_258.c b/usr.bin/xlint/lint1/msg_258.c
index fd48500d5a3b..27bbb413296f 100644
--- a/usr.bin/xlint/lint1/msg_258.c
+++ b/usr.bin/xlint/lint1/msg_258.c
@@ -1,18 +1,23 @@
-/* $NetBSD: msg_258.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_258.c,v 1.7 2024/02/02 19:07:58 rillig Exp $ */
# 3 "msg_258.c"
// Test for message: unterminated string constant [258]
/* lint1-extra-flags: -X 351 */
-int dummy;
-
-// A string literal that is not finished at the end of the line confuses the
-// parser.
-//
-// "This string doesn't end in this line.
-
-/* expect+4: error: unterminated string constant [258] */
-/* expect+3: error: syntax error '' [249] */
-/* expect+2: error: empty array declaration for 'str' [190] */
-const char str[] = "This is the end.
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated character constant [253] */
+char char_incomplete = 'x
+;
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated string constant [258] */
+char char_string_incomplete[] = "x
+;
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated character constant [253] */
+int wide_incomplete = L'x
+;
+/* expect+3: error: newline in string or char constant [254] */
+/* expect+2: error: unterminated string constant [258] */
+int wide_string_incomplete[] = L"x
+;
diff --git a/usr.bin/xlint/lint1/msg_259.c b/usr.bin/xlint/lint1/msg_259.c
index f7361c069034..74663f3485e0 100644
--- a/usr.bin/xlint/lint1/msg_259.c
+++ b/usr.bin/xlint/lint1/msg_259.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_259.c,v 1.23 2023/07/09 10:42:07 rillig Exp $ */
+/* $NetBSD: msg_259.c,v 1.25 2024/06/09 10:27:39 rillig Exp $ */
# 3 "msg_259.c"
// Test for message: argument %d is converted from '%s' to '%s' due to prototype [259]
@@ -33,6 +33,7 @@ void signed_long(long);
void unsigned_long(unsigned long);
void signed_long_long(long long);
void unsigned_long_long(unsigned long long);
+void take_float(float);
void
change_in_type_width(char c, int i, long l)
@@ -230,6 +231,24 @@ unsigned_to_unsigned(unsigned int ui, unsigned long ul, unsigned long long ull)
}
void
+constants(void)
+{
+ /* expect+2: warning: argument 1 is converted from 'long long' to 'unsigned int' due to prototype [259] */
+ /* expect+1: warning: conversion of 'long long' to 'unsigned int' is out of range, arg #1 [295] */
+ unsigned_int(0x7fffffffffffffffLL);
+ /* expect+2: warning: argument 1 is converted from 'double' to 'unsigned int' due to prototype [259] */
+ /* expect+1: warning: lossy conversion of 2.1 to 'unsigned int', arg #1 [380] */
+ unsigned_int(2.1);
+}
+
+void
+to_float(double dbl)
+{
+ /* expect+1: warning: argument 1 is converted from 'double' to 'float' due to prototype [259] */
+ take_float(dbl);
+}
+
+void
pass_sizeof_as_smaller_type(void)
{
/*
diff --git a/usr.bin/xlint/lint1/msg_262.c b/usr.bin/xlint/lint1/msg_262.c
index af5b88f5b617..9127a0a6d7ba 100644
--- a/usr.bin/xlint/lint1/msg_262.c
+++ b/usr.bin/xlint/lint1/msg_262.c
@@ -1,9 +1,9 @@
-/* $NetBSD: msg_262.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_262.c,v 1.6 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_262.c"
-/* Test for message: \" inside character constants undefined in traditional C [262] */
+/* Test for message: \" inside a character constant requires C90 or later [262] */
/* lint1-flags: -tw -X 351 */
-/* expect+1: warning: \" inside character constants undefined in traditional C [262] */
+/* expect+1: warning: \" inside a character constant requires C90 or later [262] */
char msg = '\"';
diff --git a/usr.bin/xlint/lint1/msg_263.c b/usr.bin/xlint/lint1/msg_263.c
index c8516cb2d4a7..a76c2632cdf8 100644
--- a/usr.bin/xlint/lint1/msg_263.c
+++ b/usr.bin/xlint/lint1/msg_263.c
@@ -1,9 +1,11 @@
-/* $NetBSD: msg_263.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_263.c,v 1.7 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_263.c"
-/* Test for message: \? undefined in traditional C [263] */
+/* Test for message: \? requires C90 or later [263] */
/* lint1-flags: -tw -X 351 */
-/* expect+1: warning: \? undefined in traditional C [263] */
+/* expect+1: warning: \? requires C90 or later [263] */
char ch = '\?';
+/* expect+1: warning: \? requires C90 or later [263] */
+char str[] = "Hello\?";
diff --git a/usr.bin/xlint/lint1/msg_264.c b/usr.bin/xlint/lint1/msg_264.c
index e19d89a08d03..fde178b627db 100644
--- a/usr.bin/xlint/lint1/msg_264.c
+++ b/usr.bin/xlint/lint1/msg_264.c
@@ -1,9 +1,11 @@
-/* $NetBSD: msg_264.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_264.c,v 1.6 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_264.c"
-/* Test for message: \v undefined in traditional C [264] */
+/* Test for message: \v requires C90 or later [264] */
/* lint1-flags: -tw -X 351 */
-/* expect+1: warning: \v undefined in traditional C [264] */
+/* expect+1: warning: \v requires C90 or later [264] */
+char ch = '\v';
+/* expect+1: warning: \v requires C90 or later [264] */
char str[] = "vertical \v tab";
diff --git a/usr.bin/xlint/lint1/msg_266.c b/usr.bin/xlint/lint1/msg_266.c
index 60140b1d2448..2223edaa2352 100644
--- a/usr.bin/xlint/lint1/msg_266.c
+++ b/usr.bin/xlint/lint1/msg_266.c
@@ -1,9 +1,9 @@
-/* $NetBSD: msg_266.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_266.c,v 1.6 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_266.c"
-/* Test for message: 'long double' is illegal in traditional C [266] */
+/* Test for message: 'long double' requires C90 or later [266] */
/* lint1-flags: -tw -X 351 */
-/* expect+1: warning: 'long double' is illegal in traditional C [266] */
+/* expect+1: warning: 'long double' requires C90 or later [266] */
long double ldbl = 0.0;
diff --git a/usr.bin/xlint/lint1/msg_267.c b/usr.bin/xlint/lint1/msg_267.c
index 296ea4fec484..a9b9c65e0cae 100644
--- a/usr.bin/xlint/lint1/msg_267.c
+++ b/usr.bin/xlint/lint1/msg_267.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_267.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_267.c,v 1.11 2025/09/14 12:05:05 rillig Exp $ */
# 3 "msg_267.c"
// Test for message: shift amount %u equals bit-size of '%s' [267]
@@ -20,15 +20,11 @@ shl32(unsigned int x)
}
/*
- * As of 2022-08-19, lint ignores the GCC-specific 'mode' attribute, treating
- * the tetra-int as a plain single-int, thus having width 32.
- *
* https://gcc.gnu.org/onlinedocs/gccint/Machine-Modes.html
*/
unsigned
function(unsigned __attribute__((mode(TI))) arg)
{
- /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */
return (arg >> 32) & 3;
}
@@ -57,21 +53,29 @@ shift_bit_field(void)
(s.bit_field >> 18) &
(s.bit_field >> 19) &
(s.bit_field >> 31) &
- /* XXX: Why 'int:18', not 'unsigned int:18'? */
- /* expect+1: warning: shift amount 32 equals bit-size of 'int:18' [267] */
+ // When promoting 'unsigned int:18', the target type is 'int', as
+ // it can represent all possible values; this is a bit misleading
+ // as its sign bit is always 0.
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int promoted from unsigned int:18' [267] */
(s.bit_field >> 32) &
- /* XXX: Why 'int', not 'unsigned int:18'? */
- /* expect+1: warning: shift amount 33 is greater than bit-size 32 of 'int' [122] */
+ // When promoting 'unsigned int:18', the target type is 'int', as
+ // it can represent all possible values; this is a bit misleading
+ // as its sign bit is always 0.
+ /* expect+1: warning: shift amount 33 is greater than bit-size 32 of 'int promoted from unsigned int:18' [122] */
(s.bit_field >> 33) &
(s.bit_field << 17) &
(s.bit_field << 18) &
(s.bit_field << 19) &
(s.bit_field << 31) &
- /* XXX: Why 'int:18', not 'unsigned int:18'? */
- /* expect+1: warning: shift amount 32 equals bit-size of 'int:18' [267] */
+ // When promoting 'unsigned int:18', the target type is 'int', as
+ // it can represent all possible values; this is a bit misleading
+ // as its sign bit is always 0.
+ /* expect+1: warning: shift amount 32 equals bit-size of 'int promoted from unsigned int:18' [267] */
(s.bit_field << 32) &
- /* XXX: Why 'int', not 'unsigned int:18'? */
- /* expect+1: warning: shift amount 33 is greater than bit-size 32 of 'int' [122] */
+ // When promoting 'unsigned int:18', the target type is 'int', as
+ // it can represent all possible values; this is a bit misleading
+ // as its sign bit is always 0.
+ /* expect+1: warning: shift amount 33 is greater than bit-size 32 of 'int promoted from unsigned int:18' [122] */
(s.bit_field << 33) &
15;
}
diff --git a/usr.bin/xlint/lint1/msg_270.c b/usr.bin/xlint/lint1/msg_270.c
index a59ad14ebe14..b1ce889ed98d 100644
--- a/usr.bin/xlint/lint1/msg_270.c
+++ b/usr.bin/xlint/lint1/msg_270.c
@@ -1,11 +1,11 @@
-/* $NetBSD: msg_270.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_270.c,v 1.6 2025/04/12 15:57:26 rillig Exp $ */
# 3 "msg_270.c"
-/* Test for message: function prototypes are illegal in traditional C [270] */
+/* Test for message: function prototypes require C90 or later [270] */
/* lint1-flags: -tw -X 351 */
-/* expect+1: warning: function prototypes are illegal in traditional C [270] */
+/* expect+1: warning: function prototypes require C90 or later [270] */
void prototype(void);
char *traditional();
diff --git a/usr.bin/xlint/lint1/msg_273.c b/usr.bin/xlint/lint1/msg_273.c
index aebb188221f0..dd43393bd7d9 100644
--- a/usr.bin/xlint/lint1/msg_273.c
+++ b/usr.bin/xlint/lint1/msg_273.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_273.c,v 1.3 2021/08/22 13:45:56 rillig Exp $ */
+/* $NetBSD: msg_273.c,v 1.4 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_273.c"
-/* Test for message: bit-field type '%s' invalid in ANSI C [273] */
+/* Test for message: bit-field type '%s' invalid in C90 or later [273] */
/* lint1-flags: -sw */
@@ -9,6 +9,6 @@ struct bit_fields {
int plain_int: 3;
unsigned int unsigned_int: 3;
signed int signed_int: 3;
- /* expect+1: warning: bit-field type 'unsigned char' invalid in ANSI C [273] */
+ /* expect+1: warning: bit-field type 'unsigned char' invalid in C90 or later [273] */
unsigned char unsigned_char: 3;
};
diff --git a/usr.bin/xlint/lint1/msg_274.c b/usr.bin/xlint/lint1/msg_274.c
index 00a21db0638e..faad42252ca0 100644
--- a/usr.bin/xlint/lint1/msg_274.c
+++ b/usr.bin/xlint/lint1/msg_274.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_274.c,v 1.4 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_274.c,v 1.5 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_274.c"
-/* Test for message: ANSI C forbids comparison of %s with %s [274] */
+/* Test for message: C90 or later forbid comparison of %s with %s [274] */
/* lint1-flags: -sw -X 351 */
@@ -17,7 +17,7 @@ example(void (*function_pointer)(void), void *void_pointer)
if (function_pointer == (const void *)0)
return;
- /* expect+1: warning: ANSI C forbids comparison of function pointer with 'void *' [274] */
+ /* expect+1: warning: C90 or later forbid comparison of function pointer with 'void *' [274] */
if (function_pointer == void_pointer)
return;
}
diff --git a/usr.bin/xlint/lint1/msg_276.c b/usr.bin/xlint/lint1/msg_276.c
index 41233feb6e96..8ca4dd374556 100644
--- a/usr.bin/xlint/lint1/msg_276.c
+++ b/usr.bin/xlint/lint1/msg_276.c
@@ -1,11 +1,11 @@
-/* $NetBSD: msg_276.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_276.c,v 1.6 2025/04/12 15:49:50 rillig Exp $ */
# 3 "msg_276.c"
-// Test for message: '__%s__' is illegal for type '%s' [276]
+// Test for message: '__%s__' is invalid for type '%s' [276]
/* lint1-extra-flags: -X 351 */
-/* expect+1: error: '__real__' is illegal for type 'double' [276] */
+/* expect+1: error: '__real__' is invalid for type 'double' [276] */
int real_int = __real__ 0.0;
-/* expect+1: error: '__imag__' is illegal for type 'double' [276] */
+/* expect+1: error: '__imag__' is invalid for type 'double' [276] */
int imag_int = __imag__ 0.0;
diff --git a/usr.bin/xlint/lint1/msg_277.c b/usr.bin/xlint/lint1/msg_277.c
index 502088169ae0..5d0c8f0de094 100644
--- a/usr.bin/xlint/lint1/msg_277.c
+++ b/usr.bin/xlint/lint1/msg_277.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_277.c,v 1.8 2023/07/07 06:03:31 rillig Exp $ */
+/* $NetBSD: msg_277.c,v 1.9 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_277.c"
// Test for message: initialization of '%s' with '%s' [277]
@@ -29,7 +29,7 @@ example(enum E e, int i)
/* expect+1: warning: 'init_0' set but not used in function 'example' [191] */
enum E init_0 = 0;
- /* expect+2: warning: 'init_1' set but not used in function 'example' [191] */
- /* expect+1: warning: initialization of 'enum E' with 'int' [277] */
+ /* expect+2: warning: initialization of 'enum E' with 'int' [277] */
+ /* expect+1: warning: 'init_1' set but not used in function 'example' [191] */
enum E init_1 = 1;
}
diff --git a/usr.bin/xlint/lint1/msg_285.c b/usr.bin/xlint/lint1/msg_285.c
index 91c0327897d4..633fc5254eb1 100644
--- a/usr.bin/xlint/lint1/msg_285.c
+++ b/usr.bin/xlint/lint1/msg_285.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_285.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_285.c,v 1.7 2025/01/03 03:14:47 rillig Exp $ */
# 3 "msg_285.c"
// Test for message: prototype declaration [285]
@@ -10,6 +10,7 @@ void function(int, int, int);
/* ARGSUSED */
extern void
+/* expect+1: warning: function definition for 'function' with identifier list is obsolete in C23 [384] */
function(a, b)
int a, b;
/* expect+1: error: parameter mismatch: 3 declared, 2 defined [51] */
diff --git a/usr.bin/xlint/lint1/msg_286.c b/usr.bin/xlint/lint1/msg_286.c
index 7f0b8f4d89df..6f2790267046 100644
--- a/usr.bin/xlint/lint1/msg_286.c
+++ b/usr.bin/xlint/lint1/msg_286.c
@@ -1,8 +1,27 @@
-/* $NetBSD: msg_286.c,v 1.3 2022/06/16 21:24:41 rillig Exp $ */
+/* $NetBSD: msg_286.c,v 1.4 2025/03/10 22:35:02 rillig Exp $ */
# 3 "msg_286.c"
// Test for message: function definition is not a prototype [286]
-/* expect+1: error: syntax error ':' [249] */
-TODO: "Add example code that triggers the above message."
-TODO: "Add example code that almost triggers the above message."
+/* lint1-extra-flags: -h -X 351 */
+
+/* expect+1: warning: function declaration is not a prototype [287] */
+void no_prototype_declaration();
+void prototype_declaration(void);
+
+void
+no_prototype_definition()
+/* expect+1: warning: function definition is not a prototype [286] */
+{
+}
+
+void
+prototype_definition(void)
+{
+}
+
+int
+main()
+/* expect+1: warning: function definition is not a prototype [286] */
+{
+}
diff --git a/usr.bin/xlint/lint1/msg_287.c b/usr.bin/xlint/lint1/msg_287.c
index 2fcac09e2a02..601a5d632cb3 100644
--- a/usr.bin/xlint/lint1/msg_287.c
+++ b/usr.bin/xlint/lint1/msg_287.c
@@ -1,8 +1,18 @@
-/* $NetBSD: msg_287.c,v 1.3 2022/06/16 21:24:41 rillig Exp $ */
+/* $NetBSD: msg_287.c,v 1.4 2025/03/10 22:35:02 rillig Exp $ */
# 3 "msg_287.c"
// Test for message: function declaration is not a prototype [287]
-/* expect+1: error: syntax error ':' [249] */
-TODO: "Add example code that triggers the above message."
-TODO: "Add example code that almost triggers the above message."
+/* lint1-extra-flags: -h -X 351 */
+
+/* expect+1: warning: function declaration is not a prototype [287] */
+void no_prototype_declaration();
+void prototype_declaration(void);
+
+/* expect+1: warning: function declaration is not a prototype [287] */
+typedef void (no_prototype_typedef)();
+typedef void (prototype_typedef)(void);
+
+/* expect+1: warning: function declaration is not a prototype [287] */
+int no_prototype_sizeof[sizeof(void (*)())];
+int prototype_sizeof[sizeof(void (*)(void))];
diff --git a/usr.bin/xlint/lint1/msg_296.c b/usr.bin/xlint/lint1/msg_296.c
index aa279ed4db9f..d4a2cd6e4db0 100644
--- a/usr.bin/xlint/lint1/msg_296.c
+++ b/usr.bin/xlint/lint1/msg_296.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_296.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_296.c,v 1.5 2024/06/08 06:37:06 rillig Exp $ */
# 3 "msg_296.c"
-// Test for message: conversion of negative constant to unsigned type, arg #%d [296]
+// Test for message: conversion of negative constant %lld to unsigned type '%s', arg #%d [296]
/* lint1-extra-flags: -X 351 */
@@ -10,6 +10,6 @@ void take_unsigned_int(unsigned int);
void
example(void)
{
- /* expect+1: warning: conversion of negative constant to unsigned type, arg #1 [296] */
+ /* expect+1: warning: conversion of negative constant -3 to unsigned type 'unsigned int', arg #1 [296] */
take_unsigned_int(-3);
}
diff --git a/usr.bin/xlint/lint1/msg_298.c b/usr.bin/xlint/lint1/msg_298.c
index 32893ee7320e..39136c671bdb 100644
--- a/usr.bin/xlint/lint1/msg_298.c
+++ b/usr.bin/xlint/lint1/msg_298.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_298.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_298.c,v 1.8 2025/02/27 23:46:30 rillig Exp $ */
# 3 "msg_298.c"
// Test for message: conversion from '%s' to '%s' may lose accuracy, arg #%d [298]
@@ -7,6 +7,8 @@
void take_uchar(unsigned char);
void take_schar(signed char);
+void take_uint(unsigned int);
+void take_int(int);
void
convert_bit_and(long l)
@@ -20,3 +22,12 @@ convert_bit_and(long l)
take_schar(l & 0xFF);
take_schar(l & 0x7F);
}
+
+void
+convert_mult(long long ll)
+{
+ /* expect+1: warning: conversion from 'long long' to 'int' may lose accuracy, arg #1 [298] */
+ take_int(ll * 2);
+}
+
+// For lossy floating-to-integer conversions, see messages 380 and 381.
diff --git a/usr.bin/xlint/lint1/msg_303.c b/usr.bin/xlint/lint1/msg_303.c
index 9ca01fb80d53..f6a445790f6c 100644
--- a/usr.bin/xlint/lint1/msg_303.c
+++ b/usr.bin/xlint/lint1/msg_303.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_303.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_303.c,v 1.5 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_303.c"
-/* Test for message: ANSI C forbids conversion of %s to %s [303] */
+/* Test for message: conversion of %s to %s requires a cast [303] */
/* lint1-flags: -sw -X 351 */
@@ -10,12 +10,12 @@ void take_void_pointer(void *);
void *
to_void_pointer(void)
{
- /* expect+1: warning: ANSI C forbids conversion of function pointer to 'void *' [303] */
+ /* expect+1: warning: conversion of function pointer to 'void *' requires a cast [303] */
return to_void_pointer;
}
void (*to_function_pointer(void *arg))(void)
{
- /* expect+1: warning: ANSI C forbids conversion of 'void *' to function pointer [303] */
+ /* expect+1: warning: conversion of 'void *' to function pointer requires a cast [303] */
return arg;
}
diff --git a/usr.bin/xlint/lint1/msg_304.c b/usr.bin/xlint/lint1/msg_304.c
index 5d6861482884..cbc1e5d80379 100644
--- a/usr.bin/xlint/lint1/msg_304.c
+++ b/usr.bin/xlint/lint1/msg_304.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_304.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_304.c,v 1.5 2023/08/26 10:43:53 rillig Exp $ */
# 3 "msg_304.c"
-/* Test for message: ANSI C forbids conversion of %s to %s, arg #%d [304] */
+/* Test for message: conversion of %s to %s requires a cast, arg #%d [304] */
/* lint1-flags: -sw -X 351 */
@@ -11,9 +11,9 @@ void take_function_pointer(void (*)(void));
void
caller(void *arg)
{
- /* expect+1: warning: ANSI C forbids conversion of function pointer to 'void *', arg #1 [304] */
+ /* expect+1: warning: conversion of function pointer to 'void *' requires a cast, arg #1 [304] */
take_void_pointer(caller);
- /* expect+1: warning: ANSI C forbids conversion of 'void *' to function pointer, arg #1 [304] */
+ /* expect+1: warning: conversion of 'void *' to function pointer requires a cast, arg #1 [304] */
take_function_pointer(arg);
}
diff --git a/usr.bin/xlint/lint1/msg_305.c b/usr.bin/xlint/lint1/msg_305.c
index 8a4d49c50236..ff6a2023415d 100644
--- a/usr.bin/xlint/lint1/msg_305.c
+++ b/usr.bin/xlint/lint1/msg_305.c
@@ -1,20 +1,27 @@
-/* $NetBSD: msg_305.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_305.c,v 1.6 2024/01/07 21:19:42 rillig Exp $ */
# 3 "msg_305.c"
-/* Test for message: ANSI C forbids conversion of %s to %s, op %s [305] */
+/* Test for message: conversion of %s to %s requires a cast, op %s [305] */
/* lint1-flags: -sw -X 351 */
-void take_void_pointer(void *);
-
-typedef void (*function)(void);
+void *void_pointer;
+void (*void_function)(void);
+int (*int_function)(int);
void
-caller(void **void_pointer, function *function_pointer)
+example(int cond)
{
- /* expect+1: warning: ANSI C forbids conversion of function pointer to 'void *', op = [305] */
- *void_pointer = *function_pointer;
+ /* expect+1: warning: conversion of function pointer to 'void *' requires a cast, op = [305] */
+ void_pointer = void_function;
+
+ /* expect+1: warning: conversion of 'void *' to function pointer requires a cast, op = [305] */
+ void_function = void_pointer;
- /* expect+1: warning: ANSI C forbids conversion of 'void *' to function pointer, op = [305] */
- *function_pointer = *void_pointer;
+ /* expect+1: warning: conversion of function pointer to 'void *' requires a cast, op = [305] */
+ void_pointer = cond ? void_function : int_function;
+ /* expect+1: warning: conversion of function pointer to 'void *' requires a cast, op : [305] */
+ void_pointer = cond ? void_pointer : int_function;
+ /* expect+1: warning: conversion of function pointer to 'void *' requires a cast, op : [305] */
+ void_pointer = cond ? void_function : void_pointer;
}
diff --git a/usr.bin/xlint/lint1/msg_306.c b/usr.bin/xlint/lint1/msg_306.c
index 473d4ec25a5a..2c8ea65a0d8d 100644
--- a/usr.bin/xlint/lint1/msg_306.c
+++ b/usr.bin/xlint/lint1/msg_306.c
@@ -1,32 +1,40 @@
-/* $NetBSD: msg_306.c,v 1.5 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_306.c,v 1.6 2025/02/20 21:53:28 rillig Exp $ */
# 3 "msg_306.c"
-// Test for message: constant truncated by conversion, op '%s' [306]
+// Test for message: constant %s truncated by conversion, op '%s' [306]
/* lint1-extra-flags: -X 351 */
-unsigned char
-to_u8(void)
-{
- /* expect+1: warning: conversion of 'int' to 'unsigned char' is out of range [119] */
- return 12345;
-}
+signed char s8;
+unsigned char u8;
-unsigned char
-and_u8(unsigned char a)
+void
+msg_306(void)
{
- /* XXX: unused bits in constant */
- return a & 0x1234;
-}
+ u8 = 0xff;
+ /* expect+1: warning: constant truncated by assignment [165] */
+ u8 = 0x100;
-unsigned char
-or_u8(unsigned char a)
-{
- /* expect+1: warning: constant truncated by conversion, op '|=' [306] */
- a |= 0x1234;
+ u8 &= 0xff;
+ /* expect+1: warning: constant 0x100 truncated by conversion, op '&=' [306] */
+ u8 &= 0x100;
+ /* XXX: Lint doesn't care about the expanded form of the same code. */
+ u8 = u8 & 0x100;
+ u8 |= 0xff;
+ /* expect+1: warning: constant 0x100 truncated by conversion, op '|=' [306] */
+ u8 |= 0x100;
/* XXX: Lint doesn't care about the expanded form of the same code. */
- a = a | 0x1234;
+ u8 = u8 | 0x100;
- return a;
+ s8 &= 0xff;
+ /* expect+1: warning: constant 0x100 truncated by conversion, op '&=' [306] */
+ s8 &= 0x100;
+ /* XXX: Lint doesn't care about the expanded form of the same code. */
+ s8 = s8 & 0x100;
+ s8 |= 0xff;
+ /* expect+1: warning: constant 0x100 truncated by conversion, op '|=' [306] */
+ s8 |= 0x100;
+ /* XXX: Lint doesn't care about the expanded form of the same code. */
+ s8 = s8 | 0x100;
}
diff --git a/usr.bin/xlint/lint1/msg_308.c b/usr.bin/xlint/lint1/msg_308.c
index d78e861ff0ab..4f25f121d837 100644
--- a/usr.bin/xlint/lint1/msg_308.c
+++ b/usr.bin/xlint/lint1/msg_308.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_308.c,v 1.8 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_308.c,v 1.10 2026/01/20 23:33:05 rillig Exp $ */
# 3 "msg_308.c"
// Test for message: invalid type for _Complex [308]
@@ -13,5 +13,32 @@ long double _Complex long_double_complex;
_Complex plain_complex;
/* expect+2: error: invalid type for _Complex [308] */
-/* expect+1: error: illegal type combination [4] */
+/* expect+1: error: invalid type combination [4] */
int _Complex int_complex;
+
+void *ptr;
+
+void
+reveal_types(void)
+{
+ /* expect+1: ... 'float _Complex' [171] */
+ ptr = (_Complex float)0.0;
+ /* expect+1: ... 'float _Complex' [171] */
+ ptr = (float _Complex)0.0;
+ /* expect+1: ... 'double _Complex' [171] */
+ ptr = (_Complex double)0.0;
+ /* expect+1: ... 'double _Complex' [171] */
+ ptr = (double _Complex)0.0;
+ /* expect+1: ... 'long double _Complex' [171] */
+ ptr = (_Complex double long)0.0;
+ /* expect+1: ... 'long double _Complex' [171] */
+ ptr = (_Complex long double)0.0;
+ /* expect+1: ... 'long double _Complex' [171] */
+ ptr = (double _Complex long)0.0;
+ /* expect+1: ... 'long double _Complex' [171] */
+ ptr = (double long _Complex)0.0;
+ /* expect+1: ... 'long double _Complex' [171] */
+ ptr = (long _Complex double)0.0;
+ /* expect+1: ... 'long double _Complex' [171] */
+ ptr = (long double _Complex)0.0;
+}
diff --git a/usr.bin/xlint/lint1/msg_309.c b/usr.bin/xlint/lint1/msg_309.c
index 16bfd4096687..64dc411abf87 100644
--- a/usr.bin/xlint/lint1/msg_309.c
+++ b/usr.bin/xlint/lint1/msg_309.c
@@ -1,19 +1,30 @@
-/* $NetBSD: msg_309.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_309.c,v 1.9 2025/07/08 17:43:54 rillig Exp $ */
# 3 "msg_309.c"
-// Test for message: extra bits set to 0 in conversion of '%s' to '%s', op '%s' [309]
+// Test for message: '%s' converts '%s' with its most significant bit being set to '%s' [309]
/* lint1-extra-flags: -X 351 */
-int
-scale(unsigned long long x) {
+typedef unsigned char u8_t;
+typedef unsigned short u16_t;
+typedef unsigned int u32_t;
+typedef unsigned long long u64_t;
+
+u8_t u8;
+u16_t u16;
+u32_t u32;
+u64_t u64;
+
+
+void
+test(void)
+{
/*
* Both operands of '&' have the same type, therefore no conversion
* is necessary and no bits can get lost.
*/
- if ((x & 0xffffffff00000000ULL) != 0)
- return 32;
+ u64 = u64 & 0xffffffff00000000ULL;
/*
* The constant has type 'unsigned 32-bit'. The usual arithmetic
@@ -22,9 +33,8 @@ scale(unsigned long long x) {
* bit mask here. This situation may occur during migration from a
* 32-bit to a 64-bit platform.
*/
- /* expect+1: warning: extra bits set to 0 in conversion of 'unsigned int' to 'unsigned long long', op '&' [309] */
- if ((x & 0xffff0000) != 0)
- return 16;
+ /* expect+1: warning: '&' converts 'unsigned int' with its most significant bit being set to 'unsigned long long' [309] */
+ u64 = u64 & 0xffff0000;
/*
* The integer constant is explicitly unsigned. Even in this case,
@@ -32,9 +42,8 @@ scale(unsigned long long x) {
* originally, and the intention may have been to clear the lower 16
* bits.
*/
- /* expect+1: warning: extra bits set to 0 in conversion of 'unsigned int' to 'unsigned long long', op '&' [309] */
- if ((x & 0xffff0000U) != 0)
- return 16;
+ /* expect+1: warning: '&' converts 'unsigned int' with its most significant bit being set to 'unsigned long long' [309] */
+ u64 = u64 & 0xffff0000U;
/*
* Even if the expression is written as '& ~', which makes the
@@ -42,28 +51,37 @@ scale(unsigned long long x) {
* platform the integer constant stays at 32 bits, and when porting
* the code to a 64-bit platform, the upper 32 bits are preserved.
*/
- /* expect+1: warning: extra bits set to 0 in conversion of 'unsigned int' to 'unsigned long long', op '&' [309] */
- if ((x & ~0xffffU) != 0)
- return 16;
+ /* expect+1: warning: '&' converts 'unsigned int' with its most significant bit being set to 'unsigned long long' [309] */
+ u64 = u64 & ~0xffffU;
/*
* Casting the integer constant to the proper type removes all
* ambiguities about the programmer's intention.
*/
- if ((x & (unsigned long long)~0xffffU) != 0)
- return 16;
+ u64 = u64 & (u64_t)~0xffffU;
/*
* In the remaining cases, the constant does not have its most
* significant bit set, therefore there is no ambiguity.
*/
- if ((x & 0xff00) != 0)
- return 8;
- if ((x & 0xf0) != 0)
- return 4;
- if ((x & 0xc) != 0)
- return 2;
- if ((x & 0x2) != 0)
- return 1;
- return (int)(x & 0x1);
+ u64 = u64 & 0xff00;
+ u64 = u64 & 0xf0;
+ u64 = u64 & 0xc;
+ u64 = u64 & 0x2;
+ u64 = u64 & 0x1;
+
+ u8 = u8 & 0x7f;
+ u8 = u8 & 0x80;
+ u8 = u8 & -0x80;
+ /* expect+1: warning: '&' converts 'unsigned char' with its most significant bit being set to 'int' [309] */
+ u8 = u8 & (u8_t)-0x80;
+ /* expect+1: warning: '&' converts 'unsigned char' with its most significant bit being set to 'int' [309] */
+ u8 = u8 & (u8_t)-0x80U;
+
+ /* expect+1: warning: '&=' converts 'unsigned short' with its most significant bit being set to 'int' [309] */
+ u16 &= (u16_t)~0x0600;
+ /* expect+1: warning: '&' converts 'unsigned short' with its most significant bit being set to 'int' [309] */
+ u16 = u16 & (u16_t)~0x0600;
+ /* expect+1: warning: '&' converts 'unsigned short' with its most significant bit being set to 'int' [309] */
+ u16 = (u16_t)(u16 & (u16_t)~0x0600);
}
diff --git a/usr.bin/xlint/lint1/msg_322.c b/usr.bin/xlint/lint1/msg_322.c
index ed006b1b2494..db2eddda9019 100644
--- a/usr.bin/xlint/lint1/msg_322.c
+++ b/usr.bin/xlint/lint1/msg_322.c
@@ -1,9 +1,9 @@
-/* $NetBSD: msg_322.c,v 1.3 2022/06/17 06:59:16 rillig Exp $ */
+/* $NetBSD: msg_322.c,v 1.4 2023/09/14 21:53:02 rillig Exp $ */
# 3 "msg_322.c"
-/* Test for message: zero sized array is a C99 extension [322] */
+/* Test for message: zero sized array requires C99 or later [322] */
/* lint1-flags: -sw */
-/* expect+1: error: zero sized array is a C99 extension [322] */
+/* expect+1: error: zero sized array requires C99 or later [322] */
typedef int empty_array[0];
diff --git a/usr.bin/xlint/lint1/msg_324.c b/usr.bin/xlint/lint1/msg_324.c
index 45da61f53cb6..e9d2dd55cf13 100644
--- a/usr.bin/xlint/lint1/msg_324.c
+++ b/usr.bin/xlint/lint1/msg_324.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_324.c,v 1.9 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_324.c,v 1.10 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_324.c"
// Test for message: suggest cast from '%s' to '%s' on op '%s' to avoid overflow [324]
@@ -22,13 +22,13 @@ example(char c, int i, unsigned u)
long long ll;
unsigned long long ull;
- /* expect+2: warning: 'll' set but not used in function 'example' [191] */
- /* expect+1: warning: suggest cast from 'int' to 'long long' on op '+' to avoid overflow [324] */
+ /* expect+2: warning: suggest cast from 'int' to 'long long' on op '+' to avoid overflow [324] */
+ /* expect+1: warning: 'll' set but not used in function 'example' [191] */
ll = c + i;
/* expect+1: warning: suggest cast from 'int' to 'long long' on op '-' to avoid overflow [324] */
ll = i - c;
- /* expect+2: warning: 'ull' set but not used in function 'example' [191] */
- /* expect+1: warning: suggest cast from 'unsigned int' to 'unsigned long long' on op '*' to avoid overflow [324] */
+ /* expect+2: warning: suggest cast from 'unsigned int' to 'unsigned long long' on op '*' to avoid overflow [324] */
+ /* expect+1: warning: 'ull' set but not used in function 'example' [191] */
ull = c * u;
/* expect+1: warning: suggest cast from 'unsigned int' to 'unsigned long long' on op '+' to avoid overflow [324] */
ull = u + c;
diff --git a/usr.bin/xlint/lint1/msg_333.c b/usr.bin/xlint/lint1/msg_333.c
index 7143d817a66d..153b0481830d 100644
--- a/usr.bin/xlint/lint1/msg_333.c
+++ b/usr.bin/xlint/lint1/msg_333.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_333.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_333.c,v 1.8 2024/11/13 04:32:49 rillig Exp $ */
# 3 "msg_333.c"
// Test for message: controlling expression must be bool, not '%s' [333]
@@ -41,13 +41,13 @@ example(bool b, int i, const char *p)
return "pointer";
if (__lint_false) {
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'return' statement not reached [193] */
return "bool constant";
}
/* expect+1: error: controlling expression must be bool, not 'int' [333] */
if (0) {
- /* expect+1: warning: statement not reached [193] */
+ /* expect+1: warning: 'return' statement not reached [193] */
return "integer constant";
}
diff --git a/usr.bin/xlint/lint1/msg_338.c b/usr.bin/xlint/lint1/msg_338.c
index 777b2b7928e8..b91377a49ec7 100644
--- a/usr.bin/xlint/lint1/msg_338.c
+++ b/usr.bin/xlint/lint1/msg_338.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_338.c,v 1.9 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_338.c,v 1.10 2025/02/27 22:37:37 rillig Exp $ */
# 3 "msg_338.c"
// Test for message: option '%c' should be handled in the switch [338]
@@ -156,3 +156,27 @@ unreachable_colon(int argc, char **argv)
}
return 0;
}
+
+void
+suppressed_warning(int argc, char **argv)
+{
+ int c;
+
+ /* expect+2: warning: option 'a' should be handled in the switch [338] */
+ /* expect+1: warning: option 'b' should be handled in the switch [338] */
+ while ((c = getopt(argc, argv, "ab")) != -1) {
+ switch (c) {
+ }
+ }
+ /* LINTED 338 */
+ while ((c = getopt(argc, argv, "ab")) != -1) {
+ switch (c) {
+ }
+ }
+ /* expect+2: warning: option 'a' should be handled in the switch [338] */
+ /* expect+1: warning: option 'b' should be handled in the switch [338] */
+ while ((c = getopt(argc, argv, "ab")) != -1) {
+ switch (c) {
+ }
+ }
+}
diff --git a/usr.bin/xlint/lint1/msg_339.c b/usr.bin/xlint/lint1/msg_339.c
index 69e812125cdf..ae54833c67b4 100644
--- a/usr.bin/xlint/lint1/msg_339.c
+++ b/usr.bin/xlint/lint1/msg_339.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_339.c,v 1.4 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_339.c,v 1.6 2026/01/10 17:12:26 rillig Exp $ */
# 3 "msg_339.c"
// Test for message: option '%c' should be listed in the options string [339]
@@ -47,5 +47,19 @@ main(int argc, char **argv)
}
}
+ // There may be several switch statements in the same while loop.
+ // Handling an option in the first switch statement still allows it
+ // to be handled in the second switch statement as well.
+ while ((o = getopt(argc, argv, "a")) != -1) {
+ switch (o) {
+ case 'a':
+ break;
+ }
+ switch (o) {
+ case 'a':
+ break;
+ }
+ }
+
return 0;
}
diff --git a/usr.bin/xlint/lint1/msg_341.c b/usr.bin/xlint/lint1/msg_341.c
index 68e28939a97b..7478a52113fb 100644
--- a/usr.bin/xlint/lint1/msg_341.c
+++ b/usr.bin/xlint/lint1/msg_341.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_341.c,v 1.3 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_341.c,v 1.5 2025/01/28 20:21:59 rillig Exp $ */
# 3 "msg_341.c"
// Test for message: argument to '%s' must be 'unsigned char' or EOF, not '%s' [341]
@@ -62,7 +62,7 @@ function_call_int(int c)
}
void
-macro_invocation_NetBSD(char c)
+macro_invocation_NetBSD(char c, signed char sc)
{
/* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'char' [341] */
@@ -76,4 +76,11 @@ macro_invocation_NetBSD(char c)
/* expect+1: warning: argument to 'function from <ctype.h>' must be cast to 'unsigned char', not to 'unsigned int' [342] */
sink(((int)((_ctype_tab_ + 1)[((unsigned int)c)] & 0x0040)));
+
+ // See platform_ilp32_int.c.
+ // See platform_ilp32_long.c.
+ // See platform_lp64.c.
+
+ /* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'signed char' [341] */
+ sink(((int)((_ctype_tab_ + 1)[sc])));
}
diff --git a/usr.bin/xlint/lint1/msg_343.c b/usr.bin/xlint/lint1/msg_343.c
index 63eaa4ed27bb..fa3237df4147 100644
--- a/usr.bin/xlint/lint1/msg_343.c
+++ b/usr.bin/xlint/lint1/msg_343.c
@@ -1,13 +1,13 @@
-/* $NetBSD: msg_343.c,v 1.9 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_343.c,v 1.11 2024/01/28 08:17:27 rillig Exp $ */
# 3 "msg_343.c"
-/* Test for message: static array size is a C11 extension [343] */
+/* Test for message: static array size requires C11 or later [343] */
/* lint1-flags: -Sw -X 351 */
void takes_int_pointer(int []);
void takes_int_pointer_with_ignored_size(int [3]);
-/* expect+1: error: static array size is a C11 extension [343] */
+/* expect+1: error: static array size requires C11 or later [343] */
void takes_int_array(int[static 3]);
/* expect+1: error: syntax error '3' [249] */
void takes_volatile_int_array(int[volatile 3]);
@@ -25,7 +25,7 @@ returns_int_pointer_with_ignored_size(int a[3])
}
int
-/* expect+1: error: static array size is a C11 extension [343] */
+/* expect+1: error: static array size requires C11 or later [343] */
returns_int_array(int a[static 3])
{
return a[0];
@@ -36,7 +36,7 @@ int
returns_volatile_int_array(int a[volatile 3])
{
/* expect+2: error: cannot dereference non-pointer type 'int' [96] */
- /* expect+1: ... expects to return value [214] */
+ /* expect+1: error: function 'returns_volatile_int_array' expects to return value [214] */
return a[0];
}
@@ -45,5 +45,5 @@ returns_volatile_int_array(int a[volatile 3])
* message does not make it into the actual diagnostic.
*/
/* expect+2: error: syntax error ']' [249] */
-/* expect+1: error: static array size is a C11 extension [343] */
+/* expect+1: error: static array size requires C11 or later [343] */
void invalid_storage_class(int a[const typedef 3]);
diff --git a/usr.bin/xlint/lint1/msg_346.c b/usr.bin/xlint/lint1/msg_346.c
index 7d227079e7ed..8f23ffb08cc4 100644
--- a/usr.bin/xlint/lint1/msg_346.c
+++ b/usr.bin/xlint/lint1/msg_346.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_346.c,v 1.9 2023/08/02 18:57:54 rillig Exp $ */
+/* $NetBSD: msg_346.c,v 1.10 2024/08/31 06:57:31 rillig Exp $ */
# 3 "msg_346.c"
// Test for message: call to '%s' effectively discards 'const' from argument [346]
@@ -7,11 +7,11 @@
typedef unsigned long size_t;
-void* memchr(const void *, int, size_t); /* C99 7.21.5.1 */
+void *memchr(const void *, int, size_t); /* C99 7.21.5.1 */
char *strchr(const char *, int); /* C99 7.21.5.2 */
-char* strpbrk(const char *, const char *); /* C99 7.21.5.4 */
-char* strrchr(const char *, int); /* C99 7.21.5.5 */
-char* strstr(const char *, const char *); /* C99 7.21.5.7 */
+char *strpbrk(const char *, const char *); /* C99 7.21.5.4 */
+char *strrchr(const char *, int); /* C99 7.21.5.5 */
+char *strstr(const char *, const char *); /* C99 7.21.5.7 */
void take_const_char_ptr(const char *);
void take_char_ptr(char *);
diff --git a/usr.bin/xlint/lint1/msg_348.c b/usr.bin/xlint/lint1/msg_348.c
index b0803a705e92..540eac9c265b 100644
--- a/usr.bin/xlint/lint1/msg_348.c
+++ b/usr.bin/xlint/lint1/msg_348.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_348.c,v 1.9 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_348.c,v 1.14 2025/07/11 19:03:01 rillig Exp $ */
# 3 "msg_348.c"
-// Test for message 348: maximum value %d of '%s' does not match maximum array index %d [348]
+// Test for message: maximum value %d for '%s' of type '%s' does not match maximum array index %d [348]
/* lint1-extra-flags: -r -X 351 */
@@ -24,7 +24,7 @@ color_name(enum color color)
"green",
"blue"
};
- /* No warning since the maximum enum value matches the array size. */
+ /* No warning since the maximum enum value equals the maximum array index. */
return name[color];
}
@@ -35,7 +35,7 @@ color_name_too_few(enum color color)
"red",
"green"
};
- /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 1 [348] */
+ /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 1 [348] */
return name[color];
}
@@ -48,7 +48,7 @@ color_name_too_many(enum color color)
"blue",
"black"
};
- /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
+ /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */
return name[color];
}
@@ -118,17 +118,14 @@ color_initial_letter(enum color color)
static const char len_3_of_3[3] = "RGB";
static const char len_4_of_4[4] = "RGB_";
- /* TODO: array is too short */
+ /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 1 [348] */
if (len_2_null[color] != '\0')
return;
- /* FIXME: lint should not warn since the maximum usable array index is 2 */
- /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
if (len_3_null[color] != '\0')
return;
- /* FIXME: lint should not warn since the maximum usable array index is 3, not 4 */
- /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 4 [348] */
+ /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */
if (len_4_null[color] != '\0')
return;
@@ -143,7 +140,7 @@ color_initial_letter(enum color color)
if (len_3_of_3[color] != '\0')
return;
- /* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
+ /* expect+1: warning: maximum value 2 for 'blue' of type 'enum color' does not match maximum array index 3 [348] */
if (len_4_of_4[color])
return;
}
@@ -158,9 +155,9 @@ color_name_incomplete_array(enum color color)
}
enum large {
- /* expect+1: warning: integral constant too large [56] */
+ /* expect+1: warning: constant -0x10000000000 too large for 'int' [56] */
min = -1LL << 40,
- /* expect+1: warning: integral constant too large [56] */
+ /* expect+1: warning: constant 0x10000000000 too large for 'int' [56] */
max = 1LL << 40,
zero = 0
};
@@ -247,3 +244,53 @@ lowercase_max_name(enum lowercase_max x)
static const char *const name[] = { "first", "second" };
return name[x];
}
+
+enum uppercase_n {
+ UPPERCASE_N_FIRST,
+ UPPERCASE_N_LAST,
+ N_UPPERCASE_N,
+};
+
+const char*
+uppercase_n_name(enum uppercase_n x)
+{
+ static const char *const name[] = { "first", "last" };
+ return name[x];
+}
+
+
+enum unit_prefix {
+ /* expect+4: previous declaration of 'MEGA' [260] */
+ /* expect+3: previous declaration of 'MEGA' [260] */
+ /* expect+2: previous declaration of 'MEGA' [260] */
+ /* expect+1: previous declaration of 'MEGA' [260] */
+ NONE = 0, KILO = 1, MEGA = 2
+};
+
+char
+unit_name(enum unit_prefix prefix)
+{
+ char name;
+
+ static const char name_short[] = "-K";
+ /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 1 [348] */
+ name = name_short[prefix];
+ /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 1 [348] */
+ name = "-K"[prefix];
+
+ static const char name_no_nul[] = { '-', 'K', 'M' };
+ name = name_no_nul[prefix];
+ name = (char[]){'-', 'K', 'M'}[prefix];
+
+ static const char name_nul[] = "-KM";
+ name = name_nul[prefix];
+ name = "-KM"[prefix];
+
+ static const char name_long[] = "-KMG";
+ /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 3 [348] */
+ name = name_long[prefix];
+ /* expect+1: warning: maximum value 2 for 'MEGA' of type 'enum unit_prefix' does not match maximum array index 3 [348] */
+ name = "-KMG"[prefix];
+
+ return name;
+}
diff --git a/usr.bin/xlint/lint1/msg_349.c b/usr.bin/xlint/lint1/msg_349.c
index 3724844cb2c8..e80725de417b 100644
--- a/usr.bin/xlint/lint1/msg_349.c
+++ b/usr.bin/xlint/lint1/msg_349.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_349.c,v 1.2 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: msg_349.c,v 1.3 2024/03/01 17:22:55 rillig Exp $ */
# 3 "msg_349.c"
-// Test for message 349: non type argument to alignof is a GCC extension [348]
+// Test for message: non type argument to alignof is a GCC extension [349]
/* lint1-flags: -S -w -X 351 */
diff --git a/usr.bin/xlint/lint1/msg_350.c b/usr.bin/xlint/lint1/msg_350.c
index 8c53390f071a..7947eaa8c51a 100644
--- a/usr.bin/xlint/lint1/msg_350.c
+++ b/usr.bin/xlint/lint1/msg_350.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_350.c,v 1.3 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_350.c,v 1.4 2024/03/01 17:22:55 rillig Exp $ */
# 3 "msg_350.c"
-// Test for message 350: '_Atomic' requires C11 or later [350]
+// Test for message: '_Atomic' requires C11 or later [350]
/*
* The keyword '_Atomic' was added in C11. This test ensures that in C99
diff --git a/usr.bin/xlint/lint1/msg_351.c b/usr.bin/xlint/lint1/msg_351.c
index 8e38820340c9..7d66de8706d8 100644
--- a/usr.bin/xlint/lint1/msg_351.c
+++ b/usr.bin/xlint/lint1/msg_351.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_351.c,v 1.7 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_351.c,v 1.8 2024/03/01 17:22:55 rillig Exp $ */
# 3 "msg_351.c"
-// Test for message 351: missing%s header declaration for '%s' [351]
+// Test for message: missing%s header declaration for '%s' [351]
/*
* Warn about declarations or definitions for functions or objects that are
diff --git a/usr.bin/xlint/lint1/msg_352.c b/usr.bin/xlint/lint1/msg_352.c
index 9a6465a94f11..492261fc8aba 100644
--- a/usr.bin/xlint/lint1/msg_352.c
+++ b/usr.bin/xlint/lint1/msg_352.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_352.c,v 1.2 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: msg_352.c,v 1.3 2024/03/01 17:22:55 rillig Exp $ */
# 3 "msg_352.c"
-// Test for message 352: nested 'extern' declaration of '%s' [352]
+// Test for message: nested 'extern' declaration of '%s' [352]
/*
* C allows to declare external functions or objects inside function bodies,
diff --git a/usr.bin/xlint/lint1/msg_353.c b/usr.bin/xlint/lint1/msg_353.c
index bb7c084c3763..c5859bb657ce 100644
--- a/usr.bin/xlint/lint1/msg_353.c
+++ b/usr.bin/xlint/lint1/msg_353.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_353.c,v 1.4 2023/07/14 08:53:52 rillig Exp $ */
+/* $NetBSD: msg_353.c,v 1.5 2024/03/01 17:22:55 rillig Exp $ */
# 3 "msg_353.c"
-// Test for message 353: empty initializer braces require C23 or later [353]
+// Test for message: empty initializer braces require C23 or later [353]
//
// See also:
// c23.c
diff --git a/usr.bin/xlint/lint1/msg_354.c b/usr.bin/xlint/lint1/msg_354.c
index 9e35f3468108..f9c53158ca1b 100644
--- a/usr.bin/xlint/lint1/msg_354.c
+++ b/usr.bin/xlint/lint1/msg_354.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_354.c,v 1.1 2023/08/03 18:48:42 rillig Exp $ */
+/* $NetBSD: msg_354.c,v 1.2 2024/03/01 17:22:55 rillig Exp $ */
# 3 "msg_354.c"
-// Test for message 354: '_Static_assert' requires C11 or later [354]
+// Test for message: '_Static_assert' requires C11 or later [354]
//
// See also:
// c23.c
diff --git a/usr.bin/xlint/lint1/msg_355.c b/usr.bin/xlint/lint1/msg_355.c
index 40842f8bb578..ba5683c3b6a2 100644
--- a/usr.bin/xlint/lint1/msg_355.c
+++ b/usr.bin/xlint/lint1/msg_355.c
@@ -1,7 +1,7 @@
-/* $NetBSD: msg_355.c,v 1.1 2023/08/03 18:48:42 rillig Exp $ */
+/* $NetBSD: msg_355.c,v 1.2 2024/03/01 17:22:55 rillig Exp $ */
# 3 "msg_355.c"
-// Test for message 355: '_Static_assert' without message requires C23 or later [355]
+// Test for message: '_Static_assert' without message requires C23 or later [355]
//
// See also:
// c23.c
diff --git a/usr.bin/xlint/lint1/op_colon.c b/usr.bin/xlint/lint1/op_colon.c
index 6970ba3b70d7..18e81ea79a3b 100644
--- a/usr.bin/xlint/lint1/op_colon.c
+++ b/usr.bin/xlint/lint1/op_colon.c
@@ -1,4 +1,4 @@
-/* $NetBSD: op_colon.c,v 1.7 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: op_colon.c,v 1.8 2024/01/28 08:17:27 rillig Exp $ */
# 3 "op_colon.c"
/*
@@ -59,9 +59,9 @@ test_merge_qualifiers(_Bool cond, int *p, const int *c, volatile int *v,
void
c99_6_5_15_p6(_Bool cond, const volatile double *cv_dp)
{
- /* expect+2: ... 'pointer to const volatile double' ... */
- /* expect+2: ... 'pointer to const volatile double' ... */
+ /* expect+1: ... 'pointer to const volatile double' ... */
sink(cond ? cv_dp : (void *)0);
+ /* expect+1: ... 'pointer to const volatile double' ... */
sink(cond ? (void *)0 : cv_dp);
}
@@ -76,33 +76,33 @@ c99_6_5_15_p8(
const char *c_cp
)
{
- /* expect+2: ... 'pointer to const void' ... */
- /* expect+2: ... 'pointer to const void' ... */
+ /* expect+1: ... 'pointer to const void' ... */
sink(cond ? c_vp : c_ip);
+ /* expect+1: ... 'pointer to const void' ... */
sink(cond ? c_ip : c_vp);
- /* expect+2: ... 'pointer to volatile int' ... */
- /* expect+2: ... 'pointer to volatile int' ... */
+ /* expect+1: ... 'pointer to volatile int' ... */
sink(cond ? v_ip : 0);
+ /* expect+1: ... 'pointer to volatile int' ... */
sink(cond ? 0 : v_ip);
- /* expect+2: ... 'pointer to const volatile int' ... */
- /* expect+2: ... 'pointer to const volatile int' ... */
+ /* expect+1: ... 'pointer to const volatile int' ... */
sink(cond ? c_ip : v_ip);
+ /* expect+1: ... 'pointer to const volatile int' ... */
sink(cond ? v_ip : c_ip);
- /* expect+2: ... 'pointer to const void' ... */
- /* expect+2: ... 'pointer to const void' ... */
+ /* expect+1: ... 'pointer to const void' ... */
sink(cond ? vp : c_cp);
+ /* expect+1: ... 'pointer to const void' ... */
sink(cond ? c_cp : vp);
- /* expect+2: ... 'pointer to const int' ... */
- /* expect+2: ... 'pointer to const int' ... */
+ /* expect+1: ... 'pointer to const int' ... */
sink(cond ? ip : c_ip);
+ /* expect+1: ... 'pointer to const int' ... */
sink(cond ? c_ip : ip);
- /* expect+2: ... 'pointer to void' ... */
- /* expect+2: ... 'pointer to void' ... */
+ /* expect+1: ... 'pointer to void' ... */
sink(cond ? vp : ip);
+ /* expect+1: ... 'pointer to void' ... */
sink(cond ? ip : vp);
}
diff --git a/usr.bin/xlint/lint1/parse_type_name.c b/usr.bin/xlint/lint1/parse_type_name.c
index 259e1690bfa1..7536bda95dad 100644
--- a/usr.bin/xlint/lint1/parse_type_name.c
+++ b/usr.bin/xlint/lint1/parse_type_name.c
@@ -1,4 +1,4 @@
-/* $NetBSD: parse_type_name.c,v 1.11 2023/08/02 21:11:35 rillig Exp $ */
+/* $NetBSD: parse_type_name.c,v 1.12 2023/08/26 10:43:53 rillig Exp $ */
# 3 "parse_type_name.c"
/*
@@ -141,7 +141,7 @@ cover_vararg_parameter_type_list(void)
sink(sizeof(void (*)(double, ...)));
/* cover 'T_ELLIPSIS' */
- /* expect+1: warning: ANSI C requires formal parameter before '...' [84] */
+ /* expect+1: warning: C90 to C17 require formal parameter before '...' [84] */
sink(sizeof(void (*)(...)));
}
diff --git a/usr.bin/xlint/lint1/platform_ilp32.c b/usr.bin/xlint/lint1/platform_ilp32.c
index 00167c0effd8..7ca1c0059073 100644
--- a/usr.bin/xlint/lint1/platform_ilp32.c
+++ b/usr.bin/xlint/lint1/platform_ilp32.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_ilp32.c,v 1.4 2023/02/27 23:07:53 rillig Exp $ */
+/* $NetBSD: platform_ilp32.c,v 1.6 2024/06/08 06:37:06 rillig Exp $ */
# 3 "platform_ilp32.c"
/*
@@ -10,7 +10,37 @@
* platform_ilp32_long.c
*/
-/* lint1-extra-flags: -c -h -a -p -b -r -z */
+/* lint1-extra-flags: -c -h -a -p -b -r -z -X 351 */
/* lint1-only-if: ilp32 */
-typedef int do_not_warn_about_empty_translation_unit;
+void
+switch_s64(long long x)
+{
+ switch (x) {
+ case 0x222200000001:
+ case 0x333300000001:
+ /* expect+1: error: duplicate case '37529424232449' in switch [199] */
+ case 0x222200000001:
+ case -0x7fffffffffffffff:
+ /* expect+1: error: duplicate case '-9223372036854775807' in switch [199] */
+ case -0x7fffffffffffffff:
+ break;
+ }
+}
+
+void
+switch_u64(unsigned long long x)
+{
+ switch (x) {
+ case 0x222200000001:
+ case 0x333300000001:
+ /* expect+1: error: duplicate case '37529424232449' in switch [200] */
+ case 0x222200000001:
+ /* expect+1: warning: conversion of negative constant -9223372036854775807 to unsigned type 'unsigned long long' [222] */
+ case -0x7fffffffffffffff:
+ /* expect+2: warning: conversion of negative constant -9223372036854775807 to unsigned type 'unsigned long long' [222] */
+ /* expect+1: error: duplicate case '9223372036854775809' in switch [200] */
+ case -0x7fffffffffffffff:
+ break;
+ }
+}
diff --git a/usr.bin/xlint/lint1/platform_ilp32_int.c b/usr.bin/xlint/lint1/platform_ilp32_int.c
index bfd1ccc17e5b..e93528558eb7 100644
--- a/usr.bin/xlint/lint1/platform_ilp32_int.c
+++ b/usr.bin/xlint/lint1/platform_ilp32_int.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_ilp32_int.c,v 1.2 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: platform_ilp32_int.c,v 1.9 2025/01/28 20:21:59 rillig Exp $ */
# 3 "platform_ilp32_int.c"
/*
@@ -27,3 +27,84 @@ convert_between_int_and_long(void)
u32 = ul32;
ul32 = u32;
}
+
+unsigned char u8;
+unsigned long long u64;
+unsigned char u8_buf[20];
+unsigned long long u64_buf[20];
+
+void
+array_index(void)
+{
+
+ /* expect+1: warning: array subscript 16777215 cannot be > 19 [168] */
+ u8 += u8_buf[0x00ffffff];
+ /* expect+1: warning: array subscript 2147483647 cannot be > 19 [168] */
+ u8 += u8_buf[0x7fffffff];
+ /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+1: warning: array subscript -2147483648 cannot be negative [167] */
+ u8 += u8_buf[2147483648];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u8 += u8_buf[0x80000000];
+ /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */
+ u8 += u8_buf[0xffffffff];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u8 += u8_buf[0x80000000];
+ /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */
+ u8 += u8_buf[0xffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u8 += u8_buf[0x00ffffffffffffff];
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u8 += u8_buf[0xffffffffffffffff];
+
+ /* expect+1: warning: array subscript 16777215 cannot be > 19 [168] */
+ u64 += u64_buf[0x00ffffff];
+ /* expect+2: warning: '2147483647 * 8' overflows 'int' [141] */
+ /* expect+1: warning: array subscript 268435455 cannot be > 19 [168] */
+ u64 += u64_buf[0x7fffffff];
+ /* expect+3: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+2: warning: '-2147483648 * 8' overflows 'int' [141] */
+ /* expect+1: warning: array subscript -268435456 cannot be negative [167] */
+ u64 += u64_buf[2147483648];
+ /* expect+1: warning: '2147483648 * 8' overflows 'unsigned int' [141] */
+ u64 += u64_buf[0x80000000];
+ /* expect+2: warning: '4294967295 * 8' overflows 'unsigned int' [141] */
+ /* expect+1: warning: array subscript 536870911 cannot be > 19 [168] */
+ u64 += u64_buf[0xffffffff];
+ /* expect+1: warning: '2147483648 * 8' overflows 'unsigned int' [141] */
+ u64 += u64_buf[0x80000000];
+ /* expect+2: warning: '4294967295 * 8' overflows 'unsigned int' [141] */
+ /* expect+1: warning: array subscript 536870911 cannot be > 19 [168] */
+ u64 += u64_buf[0xffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x00ffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x0fffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x1fffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x3fffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'int' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x7fffffffffffffff];
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0xffffffffffffffff];
+}
+
+
+extern const unsigned short *_ctype_tab_;
+
+int
+msg_341(void)
+{
+ // https://mail-index.netbsd.org/current-users/2024/12/15/msg045888.html
+ /* expect+2: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'unsigned int' [341] */
+ /* expect+1: warning: '4294967295 * 2' overflows 'unsigned int' [141] */
+ return (((int)((_ctype_tab_ + 1)[(0xffffffffu)])));
+
+}
diff --git a/usr.bin/xlint/lint1/platform_ilp32_long.c b/usr.bin/xlint/lint1/platform_ilp32_long.c
index c2c46d9f5fe3..83786f5e88cc 100644
--- a/usr.bin/xlint/lint1/platform_ilp32_long.c
+++ b/usr.bin/xlint/lint1/platform_ilp32_long.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_ilp32_long.c,v 1.4 2023/07/08 15:26:25 rillig Exp $ */
+/* $NetBSD: platform_ilp32_long.c,v 1.10 2025/01/28 20:21:59 rillig Exp $ */
# 3 "platform_ilp32_long.c"
/*
@@ -36,3 +36,92 @@ convert_between_int_and_long(void)
u32 = ul32;
ul32 = u32;
}
+
+unsigned char u8;
+unsigned long long u64;
+unsigned char u8_buf[20];
+unsigned long long u64_buf[20];
+
+void
+array_index(void)
+{
+
+ /* expect+1: warning: array subscript 16777215 cannot be > 19 [168] */
+ u8 += u8_buf[0x00ffffff];
+ /* expect+1: warning: array subscript 2147483647 cannot be > 19 [168] */
+ u8 += u8_buf[0x7fffffff];
+ /* expect+2: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -2147483648 cannot be negative [167] */
+ u8 += u8_buf[2147483648];
+ /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -2147483648 cannot be negative [167] */
+ u8 += u8_buf[0x80000000];
+ /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u8 += u8_buf[0xffffffff];
+ /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -2147483648 cannot be negative [167] */
+ u8 += u8_buf[0x80000000];
+ /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u8 += u8_buf[0xffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u8 += u8_buf[0x00ffffffffffffff];
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u8 += u8_buf[0xffffffffffffffff];
+
+ /* expect+1: warning: array subscript 16777215 cannot be > 19 [168] */
+ u64 += u64_buf[0x00ffffff];
+ /* expect+2: warning: '2147483647 * 8' overflows 'long' [141] */
+ /* expect+1: warning: array subscript 268435455 cannot be > 19 [168] */
+ u64 += u64_buf[0x7fffffff];
+ /* expect+3: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */
+ /* expect+1: warning: array subscript -268435456 cannot be negative [167] */
+ u64 += u64_buf[2147483648];
+ /* expect+3: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */
+ /* expect+1: warning: array subscript -268435456 cannot be negative [167] */
+ u64 += u64_buf[0x80000000];
+ /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0xffffffff];
+ /* expect+3: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+2: warning: '-2147483648 * 8' overflows 'long' [141] */
+ /* expect+1: warning: array subscript -268435456 cannot be negative [167] */
+ u64 += u64_buf[0x80000000];
+ /* expect+2: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0xffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x00ffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x0fffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x1fffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x3fffffffffffffff];
+ /* expect+2: warning: conversion of 'long long' to 'long' is out of range [119] */
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0x7fffffffffffffff];
+ /* expect+1: warning: array subscript -1 cannot be negative [167] */
+ u64 += u64_buf[0xffffffffffffffff];
+}
+
+
+extern const unsigned short *_ctype_tab_;
+
+int
+msg_341(void)
+{
+ // https://mail-index.netbsd.org/current-users/2024/12/15/msg045888.html
+ /* expect+2: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'unsigned int' [341] */
+ /* expect+1: warning: conversion of 'unsigned int' to 'long' is out of range [119] */
+ return (((int)((_ctype_tab_ + 1)[(0xffffffffu)])));
+
+}
diff --git a/usr.bin/xlint/lint1/platform_ldbl128.c b/usr.bin/xlint/lint1/platform_ldbl128.c
index 184926d97e5a..3d4443e3a274 100644
--- a/usr.bin/xlint/lint1/platform_ldbl128.c
+++ b/usr.bin/xlint/lint1/platform_ldbl128.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_ldbl128.c,v 1.6 2023/07/05 11:42:14 rillig Exp $ */
+/* $NetBSD: platform_ldbl128.c,v 1.7 2025/04/10 20:37:48 rillig Exp $ */
# 3 "platform_ldbl128.c"
/*
@@ -8,7 +8,6 @@
/* lint1-extra-flags: -c -h -a -p -b -r -z -X 351 */
/* lint1-only-if: ldbl128 */
-/* CONSTCOND */
typedef int bits_per_byte[((unsigned char)-1) == 255 ? 1 : -1];
typedef int bytes_per_long_double[sizeof(long double) == 16 ? 1 : -1];
diff --git a/usr.bin/xlint/lint1/platform_ldbl64.c b/usr.bin/xlint/lint1/platform_ldbl64.c
index 16d23baee727..de2f29daa9d8 100644
--- a/usr.bin/xlint/lint1/platform_ldbl64.c
+++ b/usr.bin/xlint/lint1/platform_ldbl64.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_ldbl64.c,v 1.5 2023/07/05 11:42:14 rillig Exp $ */
+/* $NetBSD: platform_ldbl64.c,v 1.6 2025/04/10 20:37:48 rillig Exp $ */
# 3 "platform_ldbl64.c"
/*
@@ -8,7 +8,6 @@
/* lint1-extra-flags: -c -h -a -p -b -r -z -X 351 */
/* lint1-only-if: ldbl64 */
-/* CONSTCOND */
typedef int bits_per_byte[((unsigned char)-1) == 255 ? 1 : -1];
typedef int bytes_per_long_double[sizeof(long double) == 8 ? 1 : -1];
diff --git a/usr.bin/xlint/lint1/platform_ldbl96.c b/usr.bin/xlint/lint1/platform_ldbl96.c
index 739ce69e9bdf..6d2c0edb925b 100644
--- a/usr.bin/xlint/lint1/platform_ldbl96.c
+++ b/usr.bin/xlint/lint1/platform_ldbl96.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_ldbl96.c,v 1.6 2023/07/05 11:42:14 rillig Exp $ */
+/* $NetBSD: platform_ldbl96.c,v 1.7 2025/04/10 20:37:49 rillig Exp $ */
# 3 "platform_ldbl96.c"
/*
@@ -8,7 +8,6 @@
/* lint1-extra-flags: -c -h -a -p -b -r -z -X 351 */
/* lint1-only-if: ldbl96 */
-/* CONSTCOND */
typedef int bits_per_byte[((unsigned char)-1) == 255 ? 1 : -1];
typedef int bytes_per_long_double[sizeof(long double) == 12 ? 1 : -1];
diff --git a/usr.bin/xlint/lint1/platform_long.c b/usr.bin/xlint/lint1/platform_long.c
index 9be41273ae51..5064be555b56 100644
--- a/usr.bin/xlint/lint1/platform_long.c
+++ b/usr.bin/xlint/lint1/platform_long.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_long.c,v 1.5 2023/03/28 14:44:35 rillig Exp $ */
+/* $NetBSD: platform_long.c,v 1.6 2024/11/05 04:53:28 rillig Exp $ */
# 3 "platform_long.c"
/*
@@ -17,10 +17,9 @@ convert_unsigned_char_to_size(unsigned char uc)
{
/*
* In this function call, uc is first promoted to INT. It is then
- * converted to size_t, which is ULONG. The portable bit size of INT
- * is 24 (see INT_RSIZE in inittyp.c), which is less than the 32 of
- * ULONG. Since the portable bit size increases from 24 to 32, there
- * is no warning.
+ * converted to size_t, which is ULONG. The portable rank of INT
+ * (see INT_RANK in inittyp.c) is lower than the rank of ULONG.
+ * Since the portable rank increases, there is no warning.
*
* XXX: Investigate whether this rule makes sense. Warning 259 is
* about prototype mismatch, not about lossy integer conversions,
diff --git a/usr.bin/xlint/lint1/platform_lp64.c b/usr.bin/xlint/lint1/platform_lp64.c
index 8c0ea5abbee5..b5bdcf3da7f3 100644
--- a/usr.bin/xlint/lint1/platform_lp64.c
+++ b/usr.bin/xlint/lint1/platform_lp64.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_lp64.c,v 1.7 2023/07/08 12:45:43 rillig Exp $ */
+/* $NetBSD: platform_lp64.c,v 1.19 2025/05/15 21:35:26 rillig Exp $ */
# 3 "platform_lp64.c"
/*
@@ -44,3 +44,128 @@ convert_128(void)
/* expect+1: warning: conversion from '__uint128_t' to 'unsigned int' may lose accuracy [132] */
u32 = u128;
}
+
+unsigned char u8;
+unsigned long long u64;
+unsigned char u8_buf[20];
+unsigned long long u64_buf[20];
+
+void
+array_index(void)
+{
+
+ /* expect+1: warning: array subscript 16777215 cannot be > 19 [168] */
+ u8 += u8_buf[0x00ffffff];
+ /* expect+1: warning: array subscript 2147483647 cannot be > 19 [168] */
+ u8 += u8_buf[0x7fffffff];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u8 += u8_buf[2147483648];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u8 += u8_buf[0x80000000];
+ /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */
+ u8 += u8_buf[0xffffffff];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u8 += u8_buf[0x80000000];
+ /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */
+ u8 += u8_buf[0xffffffff];
+ /* expect+1: warning: array subscript 72057594037927935 cannot be > 19 [168] */
+ u8 += u8_buf[0x00ffffffffffffff];
+ /* expect+1: warning: array subscript 18446744073709551615 cannot be > 19 [168] */
+ u8 += u8_buf[0xffffffffffffffff];
+
+ /* expect+1: warning: array subscript 16777215 cannot be > 19 [168] */
+ u64 += u64_buf[0x00ffffff];
+ /* expect+1: warning: array subscript 2147483647 cannot be > 19 [168] */
+ u64 += u64_buf[0x7fffffff];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u64 += u64_buf[2147483648];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u64 += u64_buf[0x80000000];
+ /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */
+ u64 += u64_buf[0xffffffff];
+ /* expect+1: warning: array subscript 2147483648 cannot be > 19 [168] */
+ u64 += u64_buf[0x80000000];
+ /* expect+1: warning: array subscript 4294967295 cannot be > 19 [168] */
+ u64 += u64_buf[0xffffffff];
+ /* expect+1: warning: array subscript 72057594037927935 cannot be > 19 [168] */
+ u64 += u64_buf[0x00ffffffffffffff];
+ /* expect+1: warning: array subscript 1152921504606846975 cannot be > 19 [168] */
+ u64 += u64_buf[0x0fffffffffffffff];
+ /* expect+2: warning: '2305843009213693951 * 8' overflows 'long' [141] */
+ /* expect+1: warning: array subscript 1152921504606846975 cannot be > 19 [168] */
+ u64 += u64_buf[0x1fffffffffffffff];
+ /* expect+2: warning: '4611686018427387903 * 8' overflows 'long' [141] */
+ /* expect+1: warning: array subscript 1152921504606846975 cannot be > 19 [168] */
+ u64 += u64_buf[0x3fffffffffffffff];
+ /* expect+2: warning: '9223372036854775807 * 8' overflows 'long' [141] */
+ /* expect+1: warning: array subscript 1152921504606846975 cannot be > 19 [168] */
+ u64 += u64_buf[0x7fffffffffffffff];
+ /* expect+2: warning: '18446744073709551615 * 8' overflows 'unsigned long' [141] */
+ /* expect+1: warning: array subscript 2305843009213693951 cannot be > 19 [168] */
+ u64 += u64_buf[0xffffffffffffffff];
+}
+
+extern const unsigned short *_ctype_tab_;
+
+int
+msg_341(void)
+{
+ // https://mail-index.netbsd.org/current-users/2024/12/15/msg045888.html
+ /* expect+1: warning: argument to 'function from <ctype.h>' must be 'unsigned char' or EOF, not 'unsigned int' [341] */
+ return (((int)((_ctype_tab_ + 1)[(0xffffffffu)])));
+
+}
+
+void
+msg_122(void)
+{
+ typedef unsigned typedef_type_identifier;
+ __attribute__((__mode__(TI))) typedef unsigned attr_typedef_type_identifier;
+ typedef __attribute__((__mode__(TI))) unsigned typedef_attr_type_identifier;
+ typedef unsigned __attribute__((__mode__(TI))) typedef_type_attr_identifier;
+ typedef unsigned typedef_type_identifier_attr __attribute__((__mode__(TI)));
+ __attribute__(()) __attribute__((__mode__(TI))) typedef unsigned attr_attr_typedef_type_identifier;
+ typedef __attribute__(()) __attribute__((__mode__(TI))) unsigned typedef_attr_attr_type_identifier;
+ typedef unsigned __attribute__(()) __attribute__((__mode__(TI))) typedef_type_attr_attr_identifier;
+ typedef unsigned typedef_type_identifier_attr_attr __attribute__(()) __attribute__((__mode__(TI)));
+
+ struct {
+ typedef_type_identifier typedef_type_identifier;
+ attr_typedef_type_identifier attr_typedef_type_identifier;
+ typedef_attr_type_identifier typedef_attr_type_identifier;
+ typedef_type_attr_identifier typedef_type_attr_identifier;
+ typedef_type_identifier_attr typedef_type_identifier_attr;
+ attr_attr_typedef_type_identifier attr_attr_typedef_type_identifier;
+ typedef_attr_attr_type_identifier typedef_attr_attr_type_identifier;
+ typedef_type_attr_attr_identifier typedef_type_attr_attr_identifier;
+ typedef_type_identifier_attr_attr typedef_type_identifier_attr_attr;
+ } s = {0};
+
+ /* expect+1: warning: shift amount 80 is greater than bit-size 32 of 'unsigned int' [122] */
+ u128 = s.typedef_type_identifier << 80;
+ u128 = s.attr_typedef_type_identifier << 80;
+ u128 = s.typedef_attr_type_identifier << 80;
+ u128 = s.typedef_type_attr_identifier << 80;
+ u128 = s.typedef_type_identifier_attr << 80;
+ u128 = s.attr_attr_typedef_type_identifier << 80;
+ u128 = s.typedef_attr_attr_type_identifier << 80;
+ u128 = s.typedef_type_attr_attr_identifier << 80;
+ u128 = s.typedef_type_identifier_attr_attr << 80;
+
+ unsigned type_identifier = 0;
+ __attribute__((__mode__(TI))) unsigned attr_type_identifier = 0;
+ unsigned __attribute__((__mode__(TI))) type_attr_identifier = 0;
+ unsigned type_identifier_attr __attribute__((__mode__(TI))) = 0;
+ __attribute__(()) __attribute__((__mode__(TI))) unsigned attr_attr_type_identifier = 0;
+ unsigned __attribute__(()) __attribute__((__mode__(TI))) type_attr_attr_identifier = 0;
+ unsigned type_identifier_attr_attr __attribute__(()) __attribute__((__mode__(TI))) = 0;
+
+ /* expect+1: warning: shift amount 80 is greater than bit-size 32 of 'unsigned int' [122] */
+ u128 = type_identifier << 80;
+ u128 = attr_type_identifier << 80;
+ u128 = type_attr_identifier << 80;
+ u128 = type_identifier_attr << 80;
+ u128 = attr_attr_type_identifier << 80;
+ u128 = type_attr_attr_identifier << 80;
+ u128 = type_identifier_attr_attr << 80;
+}
diff --git a/usr.bin/xlint/lint1/platform_schar.c b/usr.bin/xlint/lint1/platform_schar.c
index 15ee73ce515b..68919cd8156e 100644
--- a/usr.bin/xlint/lint1/platform_schar.c
+++ b/usr.bin/xlint/lint1/platform_schar.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_schar.c,v 1.4 2023/02/22 22:30:40 rillig Exp $ */
+/* $NetBSD: platform_schar.c,v 1.7 2025/04/07 16:06:18 rillig Exp $ */
# 3 "platform_schar.c"
/*
@@ -6,9 +6,21 @@
* representation as signed char.
*/
-/* lint1-extra-flags: -c -h -a -p -b -r -z */
+/* lint1-extra-flags: -c -h -a -p -b -r -z -X 351 */
/* lint1-only-if: schar */
-/* CONSTCOND */
/* expect+1: warning: nonportable character comparison '-128 < ?' [230] */
-typedef int is_signed[(char)'\200' < (char)'\177' ? 1 : -1];
+typedef int char_char[(char)'\200' < (char)'\177' ? 1 : -1];
+/* expect+1: warning: nonportable character comparison '-128 < ?' [230] */
+typedef int char_int[(char)'\200' < (char)127 ? 1 : -1];
+/* expect+1: warning: nonportable character comparison '-128 < ?' [230] */
+typedef int int_char[(char)-128 < (char)'\177' ? 1 : -1];
+/* expect+1: warning: nonportable character comparison '-128 < ?' [230] */
+typedef int int_int[(char)-128 < (char)127 ? 1 : -1];
+
+
+void
+first_to_upper(char *p)
+{
+ *p += 'A' - 'a';
+}
diff --git a/usr.bin/xlint/lint1/platform_uchar.c b/usr.bin/xlint/lint1/platform_uchar.c
index d2b8cbe5cbc9..c830db697f9d 100644
--- a/usr.bin/xlint/lint1/platform_uchar.c
+++ b/usr.bin/xlint/lint1/platform_uchar.c
@@ -1,4 +1,4 @@
-/* $NetBSD: platform_uchar.c,v 1.3 2023/02/22 22:12:35 rillig Exp $ */
+/* $NetBSD: platform_uchar.c,v 1.6 2025/04/07 16:06:18 rillig Exp $ */
# 3 "platform_uchar.c"
/*
@@ -6,9 +6,22 @@
* representation as unsigned char.
*/
-/* lint1-extra-flags: -c -h -a -p -b -r -z */
+/* lint1-extra-flags: -c -h -a -p -b -r -z -X 351 */
/* lint1-only-if: uchar */
-/* CONSTCOND */
/* expect+1: warning: nonportable character comparison '< 128' [230] */
-typedef int is_unsigned[(char)'\177' < (char)'\200' ? 1 : -1];
+typedef int char_char[(char)'\177' < (char)'\200' ? 1 : -1];
+/* expect+1: warning: nonportable character comparison '< 128' [230] */
+typedef int int_char[(char)127 < (char)'\200' ? 1 : -1];
+/* expect+1: warning: nonportable character comparison '< 128' [230] */
+typedef int char_int[(char)'\177' < (char)128 ? 1 : -1];
+/* expect+1: warning: nonportable character comparison '< 128' [230] */
+typedef int int_int[(char)127 < (char)128 ? 1 : -1];
+
+
+void
+first_to_upper(char *p)
+{
+ /* expect+1: warning: conversion of negative constant -32 to unsigned type 'char' [222] */
+ *p += 'A' - 'a';
+}
diff --git a/usr.bin/xlint/lint1/queries.c b/usr.bin/xlint/lint1/queries.c
index 604aaac366e3..833409aca58b 100644
--- a/usr.bin/xlint/lint1/queries.c
+++ b/usr.bin/xlint/lint1/queries.c
@@ -1,4 +1,4 @@
-/* $NetBSD: queries.c,v 1.19 2023/07/03 15:29:42 rillig Exp $ */
+/* $NetBSD: queries.c,v 1.36 2025/09/14 11:14:00 rillig Exp $ */
# 3 "queries.c"
/*
@@ -11,11 +11,14 @@
* Understanding how C works internally, by making the usual arithmetic
* conversions visible.
*
- * Finding code that intentionally suppresses a regular lint warning,
- * such as casts between arithmetic types.
+ * Finding code that intentionally suppresses a regular lint warning,
+ * such as casts between arithmetic types.
*/
-/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -X 351 */
+/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8,9,10 */
+/* lint1-extra-flags: -q 11,12,13,14,15,16,17,18,19,20 */
+/* lint1-extra-flags: -q 21,22,23,24 */
+/* lint1-extra-flags: -X 351 */
typedef unsigned char u8_t;
typedef unsigned short u16_t;
@@ -34,6 +37,7 @@ typedef double _Complex c64_t;
typedef char *str_t;
typedef const char *cstr_t;
typedef volatile char *vstr_t;
+typedef typeof(sizeof 0) size_t;
_Bool cond;
@@ -67,6 +71,12 @@ c64_t c64;
char *str;
const char *cstr;
volatile char *vstr;
+const volatile char *cvstr;
+
+void *void_ptr;
+const void *const_void_ptr;
+char *char_ptr;
+int *int_ptr;
int
Q1(double dbl)
@@ -93,15 +103,15 @@ Q3(int i, unsigned u)
i = u;
/* expect+2: implicit conversion changes sign from 'unsigned char' to 'int' [Q3] */
- /* expect+1: implicit conversion changes sign from 'int' to 'unsigned short' [Q3] */
+ /* expect+1: implicit conversion changes sign from 'int promoted from unsigned char' to 'unsigned short' [Q3] */
u16 += u8;
/* expect+2: implicit conversion changes sign from 'unsigned short' to 'int' [Q3] */
- /* expect+1: implicit conversion changes sign from 'int' to 'unsigned int' [Q3] */
+ /* expect+1: implicit conversion changes sign from 'int promoted from unsigned short' to 'unsigned int' [Q3] */
u32 += u16;
}
unsigned long long
-Q4(signed char *ptr, int i, unsigned long long ull)
+Q4(signed char *ptr, int i, unsigned long long ull, size_t sz)
{
/*
@@ -122,10 +132,12 @@ Q4(signed char *ptr, int i, unsigned long long ull)
u32 &= s32;
/* expect+3: implicit conversion changes sign from 'unsigned char' to 'int' [Q3] */
- /* expect+2: usual arithmetic conversion for '&' from 'int' to 'unsigned int' [Q4] */
- /* expect+1: implicit conversion changes sign from 'int' to 'unsigned int' [Q3] */
+ /* expect+2: usual arithmetic conversion for '&' from 'int promoted from unsigned char' to 'unsigned int' [Q4] */
+ /* expect+1: implicit conversion changes sign from 'int promoted from unsigned char' to 'unsigned int' [Q3] */
u32 = u32 & u8;
+ s8 = ptr[sz];
+
/*
* The conversion from 'signed char' to 'int' is done by the integer
* promotions (C11 6.3.1.1p2), not by the usual arithmetic
@@ -271,10 +283,10 @@ Q7(void)
/* expect+1: redundant cast from 'pointer to char' to 'pointer to char' before assignment [Q7] */
str = (str_t)str;
str = (str_t)cstr;
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'const char' [128] */
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const char' [128] */
str = (cstr_t)str;
/* expect+2: no-op cast from 'pointer to const char' to 'pointer to const char' [Q6] */
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'const char' [128] */
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const char' [128] */
str = (cstr_t)cstr;
/* expect+1: no-op cast from 'pointer to char' to 'pointer to char' [Q6] */
cstr = (str_t)str;
@@ -288,10 +300,10 @@ Q7(void)
/* expect+1: redundant cast from 'pointer to char' to 'pointer to char' before assignment [Q7] */
str = (str_t)str;
str = (str_t)vstr;
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'volatile char' [128] */
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to volatile char' [128] */
str = (vstr_t)str;
/* expect+2: no-op cast from 'pointer to volatile char' to 'pointer to volatile char' [Q6] */
- /* expect+1: warning: operands of '=' have incompatible pointer types to 'char' and 'volatile char' [128] */
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to volatile char' [128] */
str = (vstr_t)vstr;
/* expect+1: no-op cast from 'pointer to char' to 'pointer to char' [Q6] */
vstr = (str_t)str;
@@ -300,6 +312,13 @@ Q7(void)
/* expect+2: no-op cast from 'pointer to volatile char' to 'pointer to volatile char' [Q6] */
/* expect+1: redundant cast from 'pointer to volatile char' to 'pointer to volatile char' before assignment [Q7] */
vstr = (vstr_t)vstr;
+
+ /* expect+1: warning: operator '=' discards 'const volatile' from 'pointer to const volatile char' [128] */
+ str = cvstr;
+ /* expect+1: warning: operator '=' discards 'volatile' from 'pointer to const volatile char' [128] */
+ cstr = cvstr;
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const volatile char' [128] */
+ vstr = cvstr;
}
/*
@@ -311,7 +330,12 @@ Q8(void)
{
u16 = 0;
+ /* expect+1: octal number '000000' [Q8] */
u16 = 000000;
+ /* expect+1: octal number '0123' [Q8] */
+ u16 = 0123ULL;
+ u16 = 1;
+ u16 = 10;
/* expect+1: octal number '0644' [Q8] */
u16 = 0644;
/* expect+1: octal number '0000644' [Q8] */
@@ -351,13 +375,13 @@ Q9(int x)
return (0.0);
case 9:
return
-# 355 "queries.c" 3 4
+# 379 "queries.c" 3 4
((void *)0)
-# 357 "queries.c"
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */
+# 381 "queries.c"
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to void' for 'return' [183] */
;
case 10:
- /* expect+1: warning: illegal combination of integer 'int' and pointer 'pointer to void' [183] */
+ /* expect+1: warning: invalid combination of integer 'int' and pointer 'pointer to void' for 'return' [183] */
return (void *)(0);
default:
return 0;
@@ -398,9 +422,9 @@ Q12(void)
return;
/* expect+5: implicit conversion changes sign from 'unsigned char' to 'int' [Q3] */
- /* expect+4: implicit conversion changes sign from 'int' to 'unsigned short' [Q3] */
+ /* expect+4: implicit conversion changes sign from 'int promoted from unsigned char' to 'unsigned short' [Q3] */
/* expect+3: implicit conversion changes sign from 'unsigned short' to 'int' [Q3] */
- /* expect+2: implicit conversion changes sign from 'int' to 'unsigned int' [Q3] */
+ /* expect+2: implicit conversion changes sign from 'int promoted from unsigned short' to 'unsigned int' [Q3] */
/* expect+1: comma operator with types 'unsigned short' and 'unsigned int' [Q12] */
u16 += u8, u32 += u16;
}
@@ -443,14 +467,105 @@ Q15(void)
ptr_from_uint = &ptr_from_uint;
ptr_from_long = &ptr_from_long;
+ void_ptr = (void *)0;
+ const_void_ptr = (const void *)0;
+
/* expect+1: implicit conversion from integer 0 to pointer 'pointer to void' [Q15] */
return 0;
}
/*
- * Since queries do not affect the exit status, force a warning to make this
- * test conform to the general expectation that a test that produces output
- * exits non-successfully.
+ * Even though C99 6.2.2p4 allows a 'static' declaration followed by a
+ * non-'static' declaration, it may look confusing.
+ */
+static void Q16(void);
+/* expect+3: 'Q16' was declared 'static', now non-'static' [Q16] */
+/* expect+2: warning: static function 'Q16' unused [236] */
+void
+Q16(void)
+{
+}
+
+/* expect+1: invisible character U+0009 in character constant [Q17] */
+char Q17_char[] = { ' ', '\0', ' ' };
+/* expect+1: invisible character U+0009 in string literal [Q17] */
+char Q17_char_string[] = " \0 ";
+/* expect+1: invisible character U+0009 in character constant [Q17] */
+int Q17_wide[] = { L' ', L'\0', L' ' };
+/* expect+1: invisible character U+0009 in string literal [Q17] */
+int Q17_wide_string[] = L" \0 ";
+
+/* For Q18, see queries_schar.c and queries_uchar.c. */
+
+void
+convert_from_integer_to_floating(void)
+{
+ /* expect+1: implicit conversion from integer 'unsigned int' to floating point 'float' [Q19] */
+ f32 = 0xffff0000;
+ /* expect+1: implicit conversion from integer 'unsigned int' to floating point 'float' [Q19] */
+ f32 = 0xffffffff;
+ /* expect+1: implicit conversion from integer 'int' to floating point 'float' [Q19] */
+ f32 = s32;
+ /* expect+1: implicit conversion from integer 'unsigned int' to floating point 'float' [Q19] */
+ f32 = u32;
+ /* expect+1: implicit conversion from integer 'int' to floating point 'double' [Q19] */
+ f64 = s32;
+ /* expect+1: implicit conversion from integer 'unsigned int' to floating point 'double' [Q19] */
+ f64 = u32;
+ /* expect+1: implicit conversion from integer 'long long' to floating point 'double' [Q19] */
+ f64 = s64;
+ /* expect+1: implicit conversion from integer 'unsigned long long' to floating point 'double' [Q19] */
+ f64 = u64;
+
+ f32 = 0.0F;
+ f32 = 0.0;
+ f64 = 0.0;
+
+ f64 = (double)0;
+ f64 = (double)u32;
+}
+
+// C allows implicit narrowing conversions from a void pointer to an arbitrary
+// object pointer. C++ doesn't allow this conversion since it is narrowing.
+void
+Q20_void_pointer_conversion(void)
+{
+ /* expect+1: warning: operator '=' discards 'const' from 'pointer to const void' [128] */
+ void_ptr = const_void_ptr;
+ const_void_ptr = void_ptr;
+ /* expect+1: implicit narrowing conversion from void pointer to 'pointer to int' [Q20] */
+ int_ptr = void_ptr;
+ /* expect+1: redundant cast from 'pointer to void' to 'pointer to int' before assignment [Q7] */
+ int_ptr = (int *)void_ptr;
+ /* expect+1: implicit narrowing conversion from void pointer to 'pointer to char' [Q20] */
+ char_ptr = void_ptr;
+ void_ptr = char_ptr;
+ /* expect+1: implicit narrowing conversion from void pointer to 'pointer to int' [Q20] */
+ int_ptr = void_ptr;
+ /* expect+1: warning: invalid combination of 'pointer to int' and 'pointer to char', op '=' [124] */
+ int_ptr = char_ptr;
+ /* expect+1: warning: invalid combination of 'pointer to char' and 'pointer to int', op '=' [124] */
+ char_ptr = int_ptr;
+
+ int_ptr = (void *)0;
+}
+
+/*
+ * Q21, Q22, Q23 and Q24 detect typedefs for struct and union types and
+ * pointers to them. By using the tagged types directly instead of their
+ * typedefs, it may be possible to save including some system headers.
*/
-/* expect+1: warning: static variable 'unused' unused [226] */
-static int unused;
+
+struct struct_tag {
+};
+union union_tag {
+};
+
+/* expect+2: typedef 'struct_typedef' of struct type 'struct struct_tag' [Q21] */
+/* expect+1: typedef 'struct_ptr' of pointer to struct type 'pointer to struct struct_tag' [Q23] */
+typedef struct struct_tag struct_typedef, *struct_ptr;
+/* expect+2: typedef 'union_typedef' of union type 'union union_tag' [Q22] */
+/* expect+1: typedef 'union_ptr' of pointer to union type 'pointer to union union_tag' [Q24] */
+typedef union union_tag union_typedef, *union_ptr;
+typedef int int_typedef, *int_pointer;
+typedef void (function_typedef)(int), (*function_ptr)(int);
diff --git a/usr.bin/xlint/lint1/queries_schar.c b/usr.bin/xlint/lint1/queries_schar.c
index 6e3781b3a53c..2d0c586da72f 100644
--- a/usr.bin/xlint/lint1/queries_schar.c
+++ b/usr.bin/xlint/lint1/queries_schar.c
@@ -1,4 +1,4 @@
-/* $NetBSD: queries_schar.c,v 1.1 2023/07/03 15:29:42 rillig Exp $ */
+/* $NetBSD: queries_schar.c,v 1.2 2024/01/28 08:54:27 rillig Exp $ */
# 3 "queries_schar.c"
/*
@@ -11,7 +11,7 @@
*/
/* lint1-only-if: schar */
-/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -X 351 */
+/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 -X 351 */
int
Q14(char c)
@@ -24,6 +24,24 @@ Q14(char c)
}
/*
+ * Variables with automatic storage duration often have so small scope that
+ * adding the 'const' qualifier hurts readability more than it helps.
+ */
+int
+/* expect+1: const automatic variable 'const_arg' [Q18] */
+Q18(const int const_arg, int arg)
+{
+ /* expect+1: const automatic variable 'Q18_scalar' [Q18] */
+ const char Q18_scalar = '1';
+ const char Q18_array[] = { '1', '2', '3' };
+ const char Q18_string[] = "123";
+ const char *Q18_string_pointer = "123";
+
+ return const_arg + arg
+ + Q18_scalar + Q18_array[0] + Q18_string[0] + Q18_string_pointer[0];
+}
+
+/*
* Since queries do not affect the exit status, force a warning to make this
* test conform to the general expectation that a test that produces output
* exits non-successfully.
diff --git a/usr.bin/xlint/lint1/queries_uchar.c b/usr.bin/xlint/lint1/queries_uchar.c
index 602bb8ce5efa..1181afd807a0 100644
--- a/usr.bin/xlint/lint1/queries_uchar.c
+++ b/usr.bin/xlint/lint1/queries_uchar.c
@@ -1,4 +1,4 @@
-/* $NetBSD: queries_uchar.c,v 1.1 2023/07/03 15:29:42 rillig Exp $ */
+/* $NetBSD: queries_uchar.c,v 1.2 2024/01/28 08:54:27 rillig Exp $ */
# 3 "queries_uchar.c"
/*
@@ -11,23 +11,45 @@
*/
/* lint1-only-if: uchar */
-/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -X 351 */
+/* lint1-extra-flags: -q 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 -X 351 */
int
Q14(char c)
{
/* expect+6: implicit conversion changes sign from 'char' to 'int' [Q3] */
/* expect+5: implicit conversion changes sign from 'char' to 'int' [Q3] */
- /* expect+4: implicit conversion changes sign from 'char' to 'int' [Q3] */
- /* expect+3: comparison '==' of 'char' with plain integer 92 [Q14] */
- /* expect+2: implicit conversion changes sign from 'char' to 'int' [Q3] */
- /* expect+1: comparison '==' of 'char' with plain integer 0 [Q14] */
+ /* expect+4: comparison '==' of 'char' with plain integer 92 [Q14] */
+ /* expect+3: implicit conversion changes sign from 'char' to 'int' [Q3] */
+ /* expect+2: comparison '==' of 'char' with plain integer 0 [Q14] */
+ /* expect+1: implicit conversion changes sign from 'char' to 'int' [Q3] */
if (c == 'c' || c == L'w' || c == 92 || c == 0)
return 1;
return 5;
}
/*
+ * Variables with automatic storage duration often have so small scope that
+ * adding the 'const' qualifier hurts readability more than it helps.
+ */
+int
+/* expect+1: const automatic variable 'const_arg' [Q18] */
+Q18(const int const_arg, int arg)
+{
+ /* expect+1: const automatic variable 'Q18_scalar' [Q18] */
+ const char Q18_scalar = '1';
+ const char Q18_array[] = { '1', '2', '3' };
+ const char Q18_string[] = "123";
+ const char *Q18_string_pointer = "123";
+
+ /* expect+5: implicit conversion changes sign from 'char' to 'int' [Q3] */
+ /* expect+4: implicit conversion changes sign from 'char' to 'int' [Q3] */
+ /* expect+3: implicit conversion changes sign from 'char' to 'int' [Q3] */
+ /* expect+2: implicit conversion changes sign from 'char' to 'int' [Q3] */
+ return const_arg + arg
+ + Q18_scalar + Q18_array[0] + Q18_string[0] + Q18_string_pointer[0];
+}
+
+/*
* Since queries do not affect the exit status, force a warning to make this
* test conform to the general expectation that a test that produces output
* exits non-successfully.
diff --git a/usr.bin/xlint/lint1/t_integration.sh b/usr.bin/xlint/lint1/t_integration.sh
index 1d965f6d0417..71de352502a6 100644
--- a/usr.bin/xlint/lint1/t_integration.sh
+++ b/usr.bin/xlint/lint1/t_integration.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_integration.sh,v 1.82 2023/07/05 11:42:14 rillig Exp $
+# $NetBSD: t_integration.sh,v 1.85 2025/01/03 02:14:52 rillig Exp $
#
# Copyright (c) 2008, 2010 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -28,6 +28,7 @@
: "${lint1:=/usr/libexec/lint1}"
: "${archsubdir:=archsubdir_must_be_set}"
+srcdir="$(atf_get_srcdir)"
configure_test_case()
{
@@ -62,8 +63,6 @@ configure_test_case()
}
function platform_has(prop) {
- if (platform[prop] != "")
- return prop == archsubdir
if (!match(prop, /^(schar|uchar|ilp32|lp64|int|long|ldbl64|ldbl96|ldbl128)$/)) {
printf("bad property '\''%s'\''\n", prop) > "/dev/stderr"
exit(1)
@@ -90,10 +89,6 @@ configure_test_case()
for (i = 3; i < NF; i++)
if (!platform_has($i))
skip = "yes"
- } else if ($2 == "lint1-skip-if:") {
- for (i = 3; i < NF; i++)
- if (platform_has($i))
- skip = "yes"
} else {
printf("bad lint1 comment '\''%s'\''\n", $2) > "/dev/stderr"
exit(1)
@@ -109,15 +104,24 @@ configure_test_case()
local config
config="$(awk "$awk" "$1")" || exit 1
eval "$config"
+
+ case "_${1%.c}_" in
+ *_utf8_*)
+ LC_ALL=en_US.UTF-8;;
+ *)
+ LC_ALL=C;;
+ esac
+ export LC_ALL
}
-# shellcheck disable=SC2155
+tests_done=''
check_lint1()
{
- local src="$(atf_get_srcdir)/$1"
- local exp="${1%.c}.exp"
+ local src="$1"
+ local base="${src##*/}"
+ local exp="${base%.c}.exp"
local exp_ln="${src%.c}.exp-ln"
- local wrk_ln="${1%.c}.ln"
+ local wrk_ln="${base%.c}.ln"
local flags=""
local skip=""
@@ -129,13 +133,13 @@ check_lint1()
configure_test_case "$src" # sets 'skip' and 'flags'
if [ "$skip" = "yes" ]; then
- atf_skip "unsuitable platform"
+ return
fi
+ tests_done="$tests_done $src"
# shellcheck disable=SC2086
atf_check -s 'exit' -o "save:$exp" \
"$lint1" $flags "$src" "$wrk_ln"
- atf_check lua "$(atf_get_srcdir)/check-expect.lua" "$src"
if [ "$exp_ln" != '/dev/null' ]; then
# Remove comments and whitespace from the .exp-ln file.
@@ -150,21 +154,22 @@ check_lint1()
fi
}
-atf_init_test_cases()
-{
- local src name
-
- for src in "$(atf_get_srcdir)"/*.c; do
- src=${src##*/}
- name=${src%.c}
+atf_test_case lint1
+lint1_head() {
+ atf_set 'require.progs' "$lint1"
+}
+lint1_body() {
+ local src
- atf_test_case "$name"
- eval "${name}_head() {
- atf_set 'require.progs' '$lint1'
- }"
- eval "${name}_body() {
- check_lint1 '$name.c'
- }"
- atf_add_test_case "$name"
+ for src in "$srcdir"/*.c; do
+ check_lint1 "$src"
done
+
+ # shellcheck disable=SC2086
+ atf_check lua "$srcdir/check-expect.lua" $tests_done
+}
+
+atf_init_test_cases()
+{
+ atf_add_test_case lint1
}
diff --git a/usr.bin/xlint/lint1/t_usage.sh b/usr.bin/xlint/lint1/t_usage.sh
index edfb78677e0a..75ad37bf7381 100644
--- a/usr.bin/xlint/lint1/t_usage.sh
+++ b/usr.bin/xlint/lint1/t_usage.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_usage.sh,v 1.11 2023/08/03 18:48:42 rillig Exp $
+# $NetBSD: t_usage.sh,v 1.28 2025/08/31 20:43:27 rillig Exp $
#
# Copyright (c) 2023 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -39,13 +39,13 @@ suppress_messages_body()
# The largest known message.
atf_check \
- "$lint1" -X 355 code.c /dev/null
+ "$lint1" -X 386 code.c /dev/null
# Larger than the largest known message.
atf_check \
-s 'exit:1' \
- -e "inline:lint1: invalid message ID '356'\n" \
- "$lint1" -X 356 code.c /dev/null
+ -e "inline:lint1: invalid message ID '387'\n" \
+ "$lint1" -X 387 code.c /dev/null
# Whitespace is not allowed before a message ID.
atf_check \
@@ -89,13 +89,13 @@ enable_queries_body()
# The largest known query.
atf_check \
- "$lint1" -q 15 code.c /dev/null
+ "$lint1" -q 24 code.c /dev/null
# Larger than the largest known query.
atf_check \
-s 'exit:1' \
- -e "inline:lint1: invalid query ID '16'\n" \
- "$lint1" -q 16 code.c /dev/null
+ -e "inline:lint1: invalid query ID '25'\n" \
+ "$lint1" -q 25 code.c /dev/null
# Whitespace is not allowed before a query ID.
atf_check \
diff --git a/usr.bin/xlint/lint2/emit.ln b/usr.bin/xlint/lint2/emit.ln
index 9348597f73d7..b91642d63b33 100644
--- a/usr.bin/xlint/lint2/emit.ln
+++ b/usr.bin/xlint/lint2/emit.ln
@@ -1,4 +1,4 @@
-# $NetBSD: emit.ln,v 1.6 2022/10/01 10:04:06 rillig Exp $
+# $NetBSD: emit.ln,v 1.7 2024/11/05 04:53:28 rillig Exp $
#
# Test emitting a lint library file.
@@ -53,8 +53,8 @@ S expr_promote.c
0 d 0.0 d 17var_unsigned_long uL
0 d 0.0 d 20var_signed_long_long Q
0 d 0.0 d 22var_unsigned_long_long uQ
-# see emit_lp64 for __int128_t
-# see emit_lp64 for __uint128_t
+# see emit_lp64.c for __int128_t
+# see emit_lp64.c for __uint128_t
0 d 0.0 d 9var_float sD
0 d 0.0 d 10var_double D
0 d 0.0 d 15var_long_double lD
diff --git a/usr.bin/xlint/lint2/msg_000.exp b/usr.bin/xlint/lint2/msg_000.exp
index cd33137d1bb7..6aa36a52e53a 100644
--- a/usr.bin/xlint/lint2/msg_000.exp
+++ b/usr.bin/xlint/lint2/msg_000.exp
@@ -1,2 +1,2 @@
-defined_not_used defined( msg_000.c(2) ), but never used
-used_not_defined used( msg_000.c(3) ), but not defined
+defined_not_used is defined in msg_000.c(2) but never used [lint2:001]
+used_not_defined is used in msg_000.c(3) but never defined [lint2:000]
diff --git a/usr.bin/xlint/lint2/msg_000.ln b/usr.bin/xlint/lint2/msg_000.ln
index fba2fbd04907..520f38c68cf1 100644
--- a/usr.bin/xlint/lint2/msg_000.ln
+++ b/usr.bin/xlint/lint2/msg_000.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_000.ln,v 1.5 2023/08/02 18:51:25 rillig Exp $
+# $NetBSD: msg_000.ln,v 1.6 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 0 of lint2:
-# %s used( %s ), but not defined
+# %s is used in %s but never defined
#
# Define file number 0.
diff --git a/usr.bin/xlint/lint2/msg_001.exp b/usr.bin/xlint/lint2/msg_001.exp
index ecba5760fa37..44c38b59e5e5 100644
--- a/usr.bin/xlint/lint2/msg_001.exp
+++ b/usr.bin/xlint/lint2/msg_001.exp
@@ -1,2 +1,2 @@
-defined_not_used defined( msg_001.c(2) ), but never used
-used_not_defined used( msg_001.c(3) ), but not defined
+defined_not_used is defined in msg_001.c(2) but never used [lint2:001]
+used_not_defined is used in msg_001.c(3) but never defined [lint2:000]
diff --git a/usr.bin/xlint/lint2/msg_001.ln b/usr.bin/xlint/lint2/msg_001.ln
index 183ca6273e76..a25fa5c8cde4 100644
--- a/usr.bin/xlint/lint2/msg_001.ln
+++ b/usr.bin/xlint/lint2/msg_001.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_001.ln,v 1.6 2023/01/14 08:48:18 rillig Exp $
+# $NetBSD: msg_001.ln,v 1.7 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 1 of lint2:
-# %s defined( %s ), but never used
+# %s is defined in %s but never used
#
0 s msg_001.c
diff --git a/usr.bin/xlint/lint2/msg_002.exp b/usr.bin/xlint/lint2/msg_002.exp
index aad1c29813fd..ab101efc091b 100644
--- a/usr.bin/xlint/lint2/msg_002.exp
+++ b/usr.bin/xlint/lint2/msg_002.exp
@@ -1,2 +1,2 @@
-defined defined( msg_002.c(3) ), but never used
-only_declared declared( msg_002.c(2) ), but never used or defined
+defined is defined in msg_002.c(3) but never used [lint2:001]
+only_declared is declared in msg_002.c(2) but never used or defined [lint2:002]
diff --git a/usr.bin/xlint/lint2/msg_002.ln b/usr.bin/xlint/lint2/msg_002.ln
index 309d0806e816..a6ae38e13310 100644
--- a/usr.bin/xlint/lint2/msg_002.ln
+++ b/usr.bin/xlint/lint2/msg_002.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_002.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_002.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 2 of lint2:
-# %s declared( %s ), but never used or defined
+# %s is declared in %s but never used or defined
#
0 s msg_002.c
diff --git a/usr.bin/xlint/lint2/msg_003.exp b/usr.bin/xlint/lint2/msg_003.exp
index fa5bcf21a2c9..315c90176077 100644
--- a/usr.bin/xlint/lint2/msg_003.exp
+++ b/usr.bin/xlint/lint2/msg_003.exp
@@ -1,2 +1,2 @@
-function defined( msg_003_a.c(10) ), but never used
-function multiply defined msg_003_a.c(10) :: msg_003_b.c(10)
+function is defined in msg_003_a.c(10) but never used [lint2:001]
+function has multiple definitions in msg_003_a.c(10) and msg_003_b.c(10) [lint2:003]
diff --git a/usr.bin/xlint/lint2/msg_003.ln b/usr.bin/xlint/lint2/msg_003.ln
index 8d0093cc6a9e..6fec2e1772c2 100644
--- a/usr.bin/xlint/lint2/msg_003.ln
+++ b/usr.bin/xlint/lint2/msg_003.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_003.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_003.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 3 of lint2:
-# %s multiply defined %s :: %s
+# %s has multiple definitions in %s and %s
0 s msg_003_a.c
S msg_003_a.c
diff --git a/usr.bin/xlint/lint2/msg_004.exp b/usr.bin/xlint/lint2/msg_004.exp
index ed3ce1060203..180eea87afaa 100644
--- a/usr.bin/xlint/lint2/msg_004.exp
+++ b/usr.bin/xlint/lint2/msg_004.exp
@@ -1,6 +1,6 @@
-add value used inconsistently msg_004_define.c(2) :: msg_004_call.c(4)
-add value declared inconsistently (double != int) msg_004_define.c(2) :: msg_004_call.c(2)
-add, arg 1 used inconsistently msg_004_define.c(2)[double] :: msg_004_call.c(4)[int]
-add, arg 2 used inconsistently msg_004_define.c(2)[double] :: msg_004_call.c(4)[int]
-add, arg 1 declared inconsistently (double != int) msg_004_define.c(2) :: msg_004_call.c(2)
-add, arg 2 declared inconsistently (double != int) msg_004_define.c(2) :: msg_004_call.c(2)
+add has its return value used inconsistently by msg_004_define.c(2) and msg_004_call.c(4) [lint2:004]
+add returns 'double' at msg_004_define.c(2), versus 'int' at msg_004_call.c(2) [lint2:005]
+add has argument 1 with type 'double' at msg_004_define.c(2), versus 'int' at msg_004_call.c(4) [lint2:006]
+add has argument 2 with type 'double' at msg_004_define.c(2), versus 'int' at msg_004_call.c(4) [lint2:006]
+add has parameter 1 declared as 'double' in msg_004_define.c(2), versus 'int' in msg_004_call.c(2) [lint2:011]
+add has parameter 2 declared as 'double' in msg_004_define.c(2), versus 'int' in msg_004_call.c(2) [lint2:011]
diff --git a/usr.bin/xlint/lint2/msg_004.ln b/usr.bin/xlint/lint2/msg_004.ln
index 77e1d810afc3..7b442b8d3963 100644
--- a/usr.bin/xlint/lint2/msg_004.ln
+++ b/usr.bin/xlint/lint2/msg_004.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_004.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_004.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 4 of lint2:
-# %s value used inconsistently %s :: %s
+# %s has its return value used inconsistently by %s and %s
# msg_004_define.c:2: double add(double a, double b) { return a + b; }
0 s msg_004_define.c
diff --git a/usr.bin/xlint/lint2/msg_005.exp b/usr.bin/xlint/lint2/msg_005.exp
index 2ccaec9cc470..5c098fe6c47b 100644
--- a/usr.bin/xlint/lint2/msg_005.exp
+++ b/usr.bin/xlint/lint2/msg_005.exp
@@ -1,6 +1,8 @@
-add value used inconsistently msg_005_define.c(2) :: msg_005_call.c(4)
-add value declared inconsistently (double != int) msg_005_define.c(2) :: msg_005_call.c(2)
-add, arg 1 used inconsistently msg_005_define.c(2)[double] :: msg_005_call.c(4)[int]
-add, arg 2 used inconsistently msg_005_define.c(2)[double] :: msg_005_call.c(4)[int]
-add, arg 1 declared inconsistently (double != int) msg_005_define.c(2) :: msg_005_call.c(2)
-add, arg 2 declared inconsistently (double != int) msg_005_define.c(2) :: msg_005_call.c(2)
+add has its return value used inconsistently by msg_005_define.c(2) and msg_005_call.c(4) [lint2:004]
+add returns 'double' at msg_005_define.c(2), versus 'int' at msg_005_call.c(2) [lint2:005]
+add has argument 1 with type 'double' at msg_005_define.c(2), versus 'int' at msg_005_call.c(4) [lint2:006]
+add has argument 2 with type 'double' at msg_005_define.c(2), versus 'int' at msg_005_call.c(4) [lint2:006]
+add has parameter 1 declared as 'double' in msg_005_define.c(2), versus 'int' in msg_005_call.c(2) [lint2:011]
+add has parameter 2 declared as 'double' in msg_005_define.c(2), versus 'int' in msg_005_call.c(2) [lint2:011]
+pointer is defined in pointer-to-char.c(1) but never used [lint2:001]
+pointer has type 'pointer to const char' at pointer-to-char.c(1), versus 'pointer to char' at pointer-to-const-char.c(1) [lint2:005]
diff --git a/usr.bin/xlint/lint2/msg_005.ln b/usr.bin/xlint/lint2/msg_005.ln
index c6deeb245f9a..139356748541 100644
--- a/usr.bin/xlint/lint2/msg_005.ln
+++ b/usr.bin/xlint/lint2/msg_005.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_005.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_005.ln,v 1.5 2025/05/24 06:53:16 rillig Exp $
#
# Test data for message 5 of lint2:
-# %s value declared inconsistently (%s != %s) %s :: %s
+# %s returns '%s' at %s, versus '%s' at %s
# msg_005_define.c:2: double add(double a, double b) { return a + b; }
0 s msg_005_define.c
@@ -15,3 +15,12 @@ S msg_005_call.c
2 d 0.2 e 3add F2 I I I
4 c 0.4 p1 p2 u 3add f2 I I I
4 d 0.4 d r 4main F0 I
+
+# pointer-to-char.c:1: const char *pointer = "";
+0 s pointer-to-char.c
+S pointer-to-char.c
+1 d 0.1 d 7pointer PcC
+# pointer-to-const-char.c:1: extern char *pointer;
+0 s pointer-to-const-char.c
+S pointer-to-const-char.c
+1 d 0.1 e 7pointer PC
diff --git a/usr.bin/xlint/lint2/msg_006.exp b/usr.bin/xlint/lint2/msg_006.exp
index b5c175967c2b..859c51e4cce3 100644
--- a/usr.bin/xlint/lint2/msg_006.exp
+++ b/usr.bin/xlint/lint2/msg_006.exp
@@ -1,6 +1,6 @@
-add value used inconsistently msg_006_define.c(2) :: msg_006_call.c(4)
-add value declared inconsistently (double != int) msg_006_define.c(2) :: msg_006_call.c(2)
-add, arg 1 used inconsistently msg_006_define.c(2)[double] :: msg_006_call.c(4)[int]
-add, arg 2 used inconsistently msg_006_define.c(2)[double] :: msg_006_call.c(4)[int]
-add, arg 1 declared inconsistently (double != int) msg_006_define.c(2) :: msg_006_call.c(2)
-add, arg 2 declared inconsistently (double != int) msg_006_define.c(2) :: msg_006_call.c(2)
+add has its return value used inconsistently by msg_006_define.c(2) and msg_006_call.c(4) [lint2:004]
+add returns 'double' at msg_006_define.c(2), versus 'int' at msg_006_call.c(2) [lint2:005]
+add has argument 1 with type 'double' at msg_006_define.c(2), versus 'int' at msg_006_call.c(4) [lint2:006]
+add has argument 2 with type 'double' at msg_006_define.c(2), versus 'int' at msg_006_call.c(4) [lint2:006]
+add has parameter 1 declared as 'double' in msg_006_define.c(2), versus 'int' in msg_006_call.c(2) [lint2:011]
+add has parameter 2 declared as 'double' in msg_006_define.c(2), versus 'int' in msg_006_call.c(2) [lint2:011]
diff --git a/usr.bin/xlint/lint2/msg_006.ln b/usr.bin/xlint/lint2/msg_006.ln
index 197326cf44d9..cfa39f815bbc 100644
--- a/usr.bin/xlint/lint2/msg_006.ln
+++ b/usr.bin/xlint/lint2/msg_006.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_006.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_006.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 6 of lint2:
-# %s, arg %d used inconsistently %s[%s] :: %s[%s]
+# %s has argument %d with type '%s' at %s, versus '%s' at %s
# msg_006_define.c:2: double add(double a, double b) { return a + b; }
0 s msg_006_define.c
diff --git a/usr.bin/xlint/lint2/msg_007.exp b/usr.bin/xlint/lint2/msg_007.exp
index e69de29bb2d1..57cff54d6632 100644
--- a/usr.bin/xlint/lint2/msg_007.exp
+++ b/usr.bin/xlint/lint2/msg_007.exp
@@ -0,0 +1,3 @@
+params is defined in msg_007_params.c(11) but never used [lint2:001]
+params has 0 parameters in msg_007_params.c(11), versus 1 in msg_007_params.c(13) [lint2:012]
+params has 0 parameters in msg_007_params.c(11), versus 2 in msg_007_params.c(14) [lint2:012]
diff --git a/usr.bin/xlint/lint2/msg_007.ln b/usr.bin/xlint/lint2/msg_007.ln
index 1182a787f9d1..8526a1f3064b 100644
--- a/usr.bin/xlint/lint2/msg_007.ln
+++ b/usr.bin/xlint/lint2/msg_007.ln
@@ -1,6 +1,18 @@
-# $NetBSD: msg_007.ln,v 1.1 2021/08/05 22:36:08 rillig Exp $
+# $NetBSD: msg_007.ln,v 1.3 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 7 of lint2:
-# %s: variable # of args %s :: %s
+# %s has %d parameters in %s, versus %d arguments in %s
#
-# TODO: add actual test data
+
+
+# # 11 "msg_007_params.c"
+# void params(void) {}
+# void params();
+# void params(double);
+# void params(double, double);
+0 s msg_007_params.c
+S msg_007_params.c
+11 d 0.11 d 6params F0 V
+12 d 0.12 e 6params F V
+13 d 0.13 e 6params F1 D V
+14 d 0.14 e 6params F2 D D V
diff --git a/usr.bin/xlint/lint2/msg_008.exp b/usr.bin/xlint/lint2/msg_008.exp
index e23b43bdf5e8..d0d35005e59b 100644
--- a/usr.bin/xlint/lint2/msg_008.exp
+++ b/usr.bin/xlint/lint2/msg_008.exp
@@ -1 +1 @@
-func returns value which is always ignored
+func returns a value that is always ignored [lint2:008]
diff --git a/usr.bin/xlint/lint2/msg_008.ln b/usr.bin/xlint/lint2/msg_008.ln
index aa06ae73a901..18a10b5d565f 100644
--- a/usr.bin/xlint/lint2/msg_008.ln
+++ b/usr.bin/xlint/lint2/msg_008.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_008.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_008.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 8 of lint2:
-# %s returns value which is always ignored
+# %s returns a value that is always ignored
#
0 s msg_008.c
diff --git a/usr.bin/xlint/lint2/msg_009.exp b/usr.bin/xlint/lint2/msg_009.exp
index 3521e8447115..514021b73648 100644
--- a/usr.bin/xlint/lint2/msg_009.exp
+++ b/usr.bin/xlint/lint2/msg_009.exp
@@ -1 +1 @@
-func returns value which is sometimes ignored
+func returns a value that is sometimes ignored [lint2:009]
diff --git a/usr.bin/xlint/lint2/msg_009.ln b/usr.bin/xlint/lint2/msg_009.ln
index b6f6dd126bca..ab4c5ed9dce9 100644
--- a/usr.bin/xlint/lint2/msg_009.ln
+++ b/usr.bin/xlint/lint2/msg_009.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_009.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_009.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 9 of lint2:
-# %s returns value which is sometimes ignored
+# %s returns a value that is sometimes ignored
#
0 s msg_009.c
diff --git a/usr.bin/xlint/lint2/msg_010.exp b/usr.bin/xlint/lint2/msg_010.exp
index fdc89ab92530..a704df7c1b29 100644
--- a/usr.bin/xlint/lint2/msg_010.exp
+++ b/usr.bin/xlint/lint2/msg_010.exp
@@ -1 +1 @@
-func value is used( msg_010.c?(30) ), but none returned
+func has its return value used in msg_010.c?(30) but doesn't return one [lint2:010]
diff --git a/usr.bin/xlint/lint2/msg_010.ln b/usr.bin/xlint/lint2/msg_010.ln
index bea17ea1ca9d..5c60db435977 100644
--- a/usr.bin/xlint/lint2/msg_010.ln
+++ b/usr.bin/xlint/lint2/msg_010.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_010.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_010.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 10 of lint2:
-# %s value is used( %s ), but none returned
+# %s has its return value used in %s but doesn't return one
#
0 s msg_010.c
diff --git a/usr.bin/xlint/lint2/msg_011.exp b/usr.bin/xlint/lint2/msg_011.exp
index 4b31e6b5b494..f2e31d9bcb9d 100644
--- a/usr.bin/xlint/lint2/msg_011.exp
+++ b/usr.bin/xlint/lint2/msg_011.exp
@@ -1,6 +1,11 @@
-add value used inconsistently msg_011_define.c(2) :: msg_011_call.c(4)
-add value declared inconsistently (double != int) msg_011_define.c(2) :: msg_011_call.c(2)
-add, arg 1 used inconsistently msg_011_define.c(2)[double] :: msg_011_call.c(4)[int]
-add, arg 2 used inconsistently msg_011_define.c(2)[double] :: msg_011_call.c(4)[int]
-add, arg 1 declared inconsistently (double != int) msg_011_define.c(2) :: msg_011_call.c(2)
-add, arg 2 declared inconsistently (double != int) msg_011_define.c(2) :: msg_011_call.c(2)
+add has its return value used inconsistently by msg_011_define.c(2) and msg_011_call.c(4) [lint2:004]
+add returns 'double' at msg_011_define.c(2), versus 'int' at msg_011_call.c(2) [lint2:005]
+add has argument 1 with type 'double' at msg_011_define.c(2), versus 'int' at msg_011_call.c(4) [lint2:006]
+add has argument 2 with type 'double' at msg_011_define.c(2), versus 'int' at msg_011_call.c(4) [lint2:006]
+add has parameter 1 declared as 'double' in msg_011_define.c(2), versus 'int' in msg_011_call.c(2) [lint2:011]
+add has parameter 2 declared as 'double' in msg_011_define.c(2), versus 'int' in msg_011_call.c(2) [lint2:011]
+func_param is defined in msg_011_call_func.c(11) but never used [lint2:001]
+func_param has parameter 1 declared as 'pointer to function(char) returning void' in msg_011_call_func.c(11), versus 'pointer to function() returning void' in msg_011_call_func.c(12) [lint2:011]
+func_param has parameter 1 declared as 'pointer to function(char) returning void' in msg_011_call_func.c(11), versus 'pointer to function(void) returning void' in msg_011_call_func.c(13) [lint2:011]
+func_param has parameter 1 declared as 'pointer to function(char) returning void' in msg_011_call_func.c(11), versus 'pointer to function(double) returning void' in msg_011_call_func.c(14) [lint2:011]
+func_param has parameter 1 declared as 'pointer to function(char) returning void' in msg_011_call_func.c(11), versus 'pointer to function(double, double) returning void' in msg_011_call_func.c(15) [lint2:011]
diff --git a/usr.bin/xlint/lint2/msg_011.ln b/usr.bin/xlint/lint2/msg_011.ln
index 851b4dc08ea0..fb8e7e0dfdc9 100644
--- a/usr.bin/xlint/lint2/msg_011.ln
+++ b/usr.bin/xlint/lint2/msg_011.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_011.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_011.ln,v 1.6 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 11 of lint2:
-# %s, arg %d declared inconsistently (%s != %s) %s :: %s
+# %s has parameter %d declared as '%s' in %s, versus '%s' in %s
# msg_011_define.c:2: double add(double a, double b) { return a + b; }
0 s msg_011_define.c
@@ -15,3 +15,17 @@ S msg_011_call.c
2 d 0.2 e 3add F2 I I I
4 c 0.4 p1 p2 u 3add f2 I I I
4 d 0.4 d r 4main F0 I
+
+# # 11 "msg_011_call_func.c"
+# void func_param(void (*)(char)) {}
+# void func_param(void (*)());
+# void func_param(void (*)(void));
+# void func_param(void (*)(double));
+# void func_param(void (*)(double, double));
+0 s msg_011_call_func.c
+S msg_011_call_func.c
+11 d 0.11 d 10func_param F1 PF1 C V V
+12 d 0.12 e 10func_param F1 PF V V
+13 d 0.13 e 10func_param F1 PF0 V V
+14 d 0.14 e 10func_param F1 PF1 D V V
+15 d 0.15 e 10func_param F1 PF2 D D V V
diff --git a/usr.bin/xlint/lint2/msg_012.exp b/usr.bin/xlint/lint2/msg_012.exp
index 727d26728dfc..3f6846157c7e 100644
--- a/usr.bin/xlint/lint2/msg_012.exp
+++ b/usr.bin/xlint/lint2/msg_012.exp
@@ -1 +1 @@
-add: variable # of args declared msg_012_a.c(2) :: msg_012_b.c(2)
+add has 2 parameters in msg_012_a.c(2), versus 3 in msg_012_b.c(2) [lint2:012]
diff --git a/usr.bin/xlint/lint2/msg_012.ln b/usr.bin/xlint/lint2/msg_012.ln
index 338356b243bf..3e463c6253d4 100644
--- a/usr.bin/xlint/lint2/msg_012.ln
+++ b/usr.bin/xlint/lint2/msg_012.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_012.ln,v 1.3 2021/08/24 23:38:51 rillig Exp $
+# $NetBSD: msg_012.ln,v 1.4 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 12 of lint2:
-# %s: variable # of args declared %s :: %s
+# %s has %d parameters in %s, versus %d in %s
# msg_012_a.c:2: int add(int, int);
0 s msg_012_a.c
diff --git a/usr.bin/xlint/lint2/msg_013.exp b/usr.bin/xlint/lint2/msg_013.exp
index 402fac2ff7ce..10dd3448601b 100644
--- a/usr.bin/xlint/lint2/msg_013.exp
+++ b/usr.bin/xlint/lint2/msg_013.exp
@@ -1,3 +1,3 @@
-my_printf: malformed format string local.c(12)
-my_printf: malformed format string local.c(13)
-my_printf, arg 2 inconsistent with format local.c(13)
+my_printf is called with a malformed format string in local.c(12) [lint2:013]
+my_printf is called with a malformed format string in local.c(13) [lint2:013]
+my_printf is called in local.c(13) with argument 2 being incompatible with format string [lint2:014]
diff --git a/usr.bin/xlint/lint2/msg_013.ln b/usr.bin/xlint/lint2/msg_013.ln
index f11a77725470..4dc8423d877c 100644
--- a/usr.bin/xlint/lint2/msg_013.ln
+++ b/usr.bin/xlint/lint2/msg_013.ln
@@ -1,7 +1,7 @@
-# $NetBSD: msg_013.ln,v 1.2 2023/08/05 09:44:18 rillig Exp $
+# $NetBSD: msg_013.ln,v 1.3 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 13 of lint2:
-# %s: malformed format string %s
+# %s is called with a malformed format string in %s
#
0 s local.c
diff --git a/usr.bin/xlint/lint2/msg_014.ln b/usr.bin/xlint/lint2/msg_014.ln
index e962833ca9e3..18bf648c8864 100644
--- a/usr.bin/xlint/lint2/msg_014.ln
+++ b/usr.bin/xlint/lint2/msg_014.ln
@@ -1,6 +1,6 @@
-# $NetBSD: msg_014.ln,v 1.1 2021/08/05 22:36:08 rillig Exp $
+# $NetBSD: msg_014.ln,v 1.2 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 14 of lint2:
-# %s, arg %d inconsistent with format %s
+# %s is called in %s with argument %d being incompatible with format string
#
# TODO: add actual test data
diff --git a/usr.bin/xlint/lint2/msg_015.ln b/usr.bin/xlint/lint2/msg_015.ln
index b34f4895926f..698e9bd497cc 100644
--- a/usr.bin/xlint/lint2/msg_015.ln
+++ b/usr.bin/xlint/lint2/msg_015.ln
@@ -1,6 +1,6 @@
-# $NetBSD: msg_015.ln,v 1.1 2021/08/05 22:36:08 rillig Exp $
+# $NetBSD: msg_015.ln,v 1.2 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 15 of lint2:
-# %s: too few args for format %s
+# %s is called in %s with too few arguments for format string
#
# TODO: add actual test data
diff --git a/usr.bin/xlint/lint2/msg_016.ln b/usr.bin/xlint/lint2/msg_016.ln
index 6b8683a58516..2f44e6c3566d 100644
--- a/usr.bin/xlint/lint2/msg_016.ln
+++ b/usr.bin/xlint/lint2/msg_016.ln
@@ -1,6 +1,6 @@
-# $NetBSD: msg_016.ln,v 1.2 2022/04/01 01:00:39 rillig Exp $
+# $NetBSD: msg_016.ln,v 1.3 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 16 of lint2:
-# %s: too many args for format %s
+# %s is called in %s with too many arguments for format string
#
# TODO: add actual test data
diff --git a/usr.bin/xlint/lint2/msg_017.ln b/usr.bin/xlint/lint2/msg_017.ln
index a6b7f0e04e77..68722729e83e 100644
--- a/usr.bin/xlint/lint2/msg_017.ln
+++ b/usr.bin/xlint/lint2/msg_017.ln
@@ -1,6 +1,6 @@
-# $NetBSD: msg_017.ln,v 1.1 2021/08/05 22:36:08 rillig Exp $
+# $NetBSD: msg_017.ln,v 1.2 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 17 of lint2:
-# %s function value must be declared before use %s :: %s
+# %s's return type in %s must be declared before use in %s
#
# TODO: add actual test data
diff --git a/usr.bin/xlint/lint2/msg_018.ln b/usr.bin/xlint/lint2/msg_018.ln
index bd17f8475689..2c1378e9dab4 100644
--- a/usr.bin/xlint/lint2/msg_018.ln
+++ b/usr.bin/xlint/lint2/msg_018.ln
@@ -1,6 +1,6 @@
-# $NetBSD: msg_018.ln,v 1.1 2021/08/05 22:36:08 rillig Exp $
+# $NetBSD: msg_018.ln,v 1.2 2025/02/20 19:04:00 rillig Exp $
#
# Test data for message 18:
-# %s renamed multiple times %s :: %s
+# %s is renamed multiple times in %s and %s
#
# TODO: add actual test data
diff --git a/usr.bin/xlint/lint2/output_sorted.exp b/usr.bin/xlint/lint2/output_sorted.exp
index 314c7d43746a..16de1f86ae1a 100644
--- a/usr.bin/xlint/lint2/output_sorted.exp
+++ b/usr.bin/xlint/lint2/output_sorted.exp
@@ -1,27 +1,27 @@
-func0000 used( output_sorted.c(10) ), but not defined
-func0000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func0000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-func1000 used( output_sorted.c(10) ), but not defined
-func1000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func1000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-func2000 used( output_sorted.c(10) ), but not defined
-func2000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func2000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-func3000 used( output_sorted.c(10) ), but not defined
-func3000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func3000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-func4000 used( output_sorted.c(10) ), but not defined
-func4000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func4000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-func5000 used( output_sorted.c(10) ), but not defined
-func5000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func5000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-func6000 used( output_sorted.c(10) ), but not defined
-func6000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func6000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-func7000 used( output_sorted.c(10) ), but not defined
-func7000, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-func7000, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
-no_prototype used( output_sorted.c(10) ), but not defined
-no_prototype, arg 1 used inconsistently output_sorted.c(10)[int] :: output_sorted.c(11)[pointer to const char]
-no_prototype, arg 2 used inconsistently output_sorted.c(10)[pointer to const char] :: output_sorted.c(11)[double]
+func0000 is used in output_sorted.c(10) but never defined [lint2:000]
+func0000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func0000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+func1000 is used in output_sorted.c(10) but never defined [lint2:000]
+func1000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func1000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+func2000 is used in output_sorted.c(10) but never defined [lint2:000]
+func2000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func2000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+func3000 is used in output_sorted.c(10) but never defined [lint2:000]
+func3000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func3000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+func4000 is used in output_sorted.c(10) but never defined [lint2:000]
+func4000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func4000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+func5000 is used in output_sorted.c(10) but never defined [lint2:000]
+func5000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func5000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+func6000 is used in output_sorted.c(10) but never defined [lint2:000]
+func6000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func6000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+func7000 is used in output_sorted.c(10) but never defined [lint2:000]
+func7000 has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+func7000 has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
+no_prototype is used in output_sorted.c(10) but never defined [lint2:000]
+no_prototype has argument 1 with type 'int' at output_sorted.c(10), versus 'pointer to const char' at output_sorted.c(11) [lint2:006]
+no_prototype has argument 2 with type 'pointer to const char' at output_sorted.c(10), versus 'double' at output_sorted.c(11) [lint2:006]
diff --git a/usr.bin/xlint/lint2/read.exp b/usr.bin/xlint/lint2/read.exp
index b0c0305bd44c..47d4866630f1 100644
--- a/usr.bin/xlint/lint2/read.exp
+++ b/usr.bin/xlint/lint2/read.exp
@@ -1,15 +1,15 @@
-a125 declared( read.c(125) ), but never used or defined
-inline_function defined( read.c(256) ), but never used
-inline_function value declared inconsistently (void != int) read.c(256) :: read.c(260)
-printflike_0_comment defined( read.c(217) ), but never used
-printflike_10_comment defined( read.c(229) ), but never used
-printflike_3_comment defined( read.c(223) ), but never used
-printflike_comment defined( read.c(211) ), but never used
-scanflike_0_comment defined( read.c(243) ), but never used
-scanflike_3_comment defined( read.c(249) ), but never used
-scanflike_comment defined( read.c(237) ), but never used
-used_function value declared inconsistently (int != void) read.c(254) :: read.c(253)
-used_function returns value which is sometimes ignored
-varargs_0_comment defined( read.c(199) ), but never used
-varargs_3_comment defined( read.c(205) ), but never used
-varargs_comment defined( read.c(193) ), but never used
+a125 is declared in read.c(125) but never used or defined [lint2:002]
+inline_function is defined in read.c(256) but never used [lint2:001]
+inline_function returns 'void' at read.c(256), versus 'int' at read.c(260) [lint2:005]
+printflike_0_comment is defined in read.c(217) but never used [lint2:001]
+printflike_10_comment is defined in read.c(229) but never used [lint2:001]
+printflike_3_comment is defined in read.c(223) but never used [lint2:001]
+printflike_comment is defined in read.c(211) but never used [lint2:001]
+scanflike_0_comment is defined in read.c(243) but never used [lint2:001]
+scanflike_3_comment is defined in read.c(249) but never used [lint2:001]
+scanflike_comment is defined in read.c(237) but never used [lint2:001]
+used_function returns 'int' at read.c(254), versus 'void' at read.c(253) [lint2:005]
+used_function returns a value that is sometimes ignored [lint2:009]
+varargs_0_comment is defined in read.c(199) but never used [lint2:001]
+varargs_3_comment is defined in read.c(205) but never used [lint2:001]
+varargs_comment is defined in read.c(193) but never used [lint2:001]
diff --git a/usr.bin/xlint/lint2/read.ln b/usr.bin/xlint/lint2/read.ln
index b51beb5cd078..0a3f4b8929dd 100644
--- a/usr.bin/xlint/lint2/read.ln
+++ b/usr.bin/xlint/lint2/read.ln
@@ -1,4 +1,4 @@
-# $NetBSD: read.ln,v 1.8 2023/08/02 18:51:25 rillig Exp $
+# $NetBSD: read.ln,v 1.9 2024/11/05 04:53:28 rillig Exp $
#
# Cover each path of reading declarations, definitions and usages.
@@ -25,8 +25,8 @@ S read.c
112 d 0.112 e 4f112 F0 uL # ULONG unsigned long f112(void);
113 d 0.113 e 4f113 F0 Q # LLONG long long f113(void);
114 d 0.114 e 4f114 F0 uQ # ULLONG unsigned long long f114(void);
-# INT128 works only in 64-bit mode, see read_lp64.
-# UINT128 works only in 64-bit mode, see read_lp64.
+# INT128 works only in 64-bit mode, see read_lp64.ln.
+# UINT128 works only in 64-bit mode, see read_lp64.ln.
117 d 0.117 e 4f117 F0 sD # FLOAT float f117(void);
118 d 0.118 e 4f118 F0 D # DOUBLE double f118(void);
119 d 0.119 e 4f119 F0 lD # LDOUBLE long double f119(void);
diff --git a/usr.bin/xlint/xlint/t_xlint.sh b/usr.bin/xlint/xlint/t_xlint.sh
index 65d414b879a2..75b227f6267b 100644
--- a/usr.bin/xlint/xlint/t_xlint.sh
+++ b/usr.bin/xlint/xlint/t_xlint.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_xlint.sh,v 1.3 2023/07/07 19:45:22 rillig Exp $
+# $NetBSD: t_xlint.sh,v 1.5 2024/11/30 18:17:12 rillig Exp $
#
# Copyright (c) 2023 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -105,9 +105,12 @@ run_lint2_body()
# Most of the command line options are not relevant for lint2,
# so they are effectively ignored. The option '-i' is absent.
+ #
+ # Depending on whether the lint libraries are installed or not, there
+ # may be a warning 'cannot find llib-lc.ln' on stderr.
atf_check \
- -o 'inline:function defined( input.c(4) ), but never used\n' \
- -e 'inline:lint: cannot find llib-lc.ln\n' \
+ -o 'inline:function is defined in input.c(4) but never used [lint2:001]\n' \
+ -e 'ignore' \
"$lint" -aabceghprSTxz input.ln
}
diff --git a/usr.sbin/Makefile b/usr.sbin/Makefile
index 9b4e7af3d9e3..d50a8f1d2132 100644
--- a/usr.sbin/Makefile
+++ b/usr.sbin/Makefile
@@ -1,11 +1,13 @@
-# $NetBSD: Makefile,v 1.7 2021/08/29 09:54:18 christos Exp $
+# $NetBSD: Makefile,v 1.9 2024/10/18 23:22:52 christos Exp $
.include <bsd.own.mk>
TESTSDIR= ${TESTSBASE}/usr.sbin
+TESTS_SUBDIRS+= certctl
TESTS_SUBDIRS+= cpuctl
TESTS_SUBDIRS+= execsnoop
TESTS_SUBDIRS+= inetd
+TESTS_SUBDIRS+= makefs
TESTS_SUBDIRS+= mtree
TESTS_SUBDIRS+= opensnoop
TESTS_SUBDIRS+= stdethers
diff --git a/usr.sbin/cpuctl/t_cpuctl.sh b/usr.sbin/cpuctl/t_cpuctl.sh
index 7b07cb68977b..dd21136994a3 100644
--- a/usr.sbin/cpuctl/t_cpuctl.sh
+++ b/usr.sbin/cpuctl/t_cpuctl.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_cpuctl.sh,v 1.6 2021/04/12 01:18:13 mrg Exp $
+# $NetBSD: t_cpuctl.sh,v 1.7 2025/06/02 19:04:25 martin Exp $
#
# Copyright (c) 2020 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -27,7 +27,7 @@
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
-tmp="/tmp/cpuctl.txt"
+tmp="./cpuctl.txt"
setcpu() {
@@ -61,6 +61,8 @@ setcpu() {
clean() {
+ [ -r $tmp ] || return 0
+
i=0
while read line; do
diff --git a/usr.sbin/inetd/t_inetd.c b/usr.sbin/inetd/t_inetd.c
index 9c82a17ee82e..d747751d275a 100644
--- a/usr.sbin/inetd/t_inetd.c
+++ b/usr.sbin/inetd/t_inetd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: t_inetd.c,v 1.2 2021/09/01 06:12:50 christos Exp $ */
+/* $NetBSD: t_inetd.c,v 1.3 2025/01/05 08:23:33 riastradh Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: t_inetd.c,v 1.2 2021/09/01 06:12:50 christos Exp $");
+__RCSID("$NetBSD: t_inetd.c,v 1.3 2025/01/05 08:23:33 riastradh Exp $");
#include <atf-c.h>
#include <spawn.h>
@@ -81,7 +81,7 @@ ATF_TC_BODY(test_ratelimit, tc)
concat(atf_tc_get_config_var(tc, "srcdir"), "/test_server"),
"test_server"
);
-
+
/* Run inetd in debug mode using specified config file */
proc = run("inetd", (char* const []) {
__UNCONST("inetd"), __UNCONST("-d"),
@@ -102,9 +102,9 @@ ATF_TC_BODY(test_ratelimit, tc)
for (int i = 0; i < 3; i++) {
ATF_REQUIRE(run_udp_client("5432"));
}
-
+
/* Rate limiting should prevent a response to this request */
- ATF_REQUIRE(!run_udp_client("5432"));
+ ATF_REQUIRE(!run_udp_client("5432"));
/* dgram/wait ip_max of 0 */
ATF_REQUIRE(!run_udp_client("5433"));
@@ -156,7 +156,7 @@ ATF_TP_ADD_TCS(tp)
}
/* Return true if successfully received message, false if timeout */
-static bool
+static bool
run_udp_client(const char *port)
{
char buffer[] = "test";
@@ -164,7 +164,7 @@ run_udp_client(const char *port)
int udp = create_socket("127.0.0.1", port, SOCK_DGRAM, UDP, 1, &addr);
- CHECK_ERROR(sendto(udp, buffer, sizeof(buffer), 0,
+ CHECK_ERROR(sendto(udp, buffer, sizeof(buffer), 0,
(struct sockaddr *)&addr, addr.ss_len));
struct iovec iov = {
@@ -202,14 +202,14 @@ run_tcp_client(const char *port)
ssize_t count;
int tcp;
char buffer[] = "test";
-
+
tcp = create_socket("127.0.0.1", port, SOCK_STREAM, TCP, 1, &remote);
CHECK_ERROR(connect(tcp, (const struct sockaddr *)&remote,
remote.ss_len));
CHECK_ERROR(send(tcp, buffer, sizeof(buffer), 0));
count = recv(tcp, buffer, sizeof(buffer), 0);
if (count == -1) {
- /*
+ /*
* Connection reset by peer indicates the connection was
* dropped. EAGAIN indicates the timeout expired. Any other
* error is unexpected for this client program test.
@@ -229,12 +229,12 @@ run_tcp_client(const char *port)
return true;
}
-/*
- * Create a socket with the characteristics inferred by the args, return parsed
+/*
+ * Create a socket with the characteristics inferred by the args, return parsed
* socket address in dst.
*/
static int
-create_socket(const char *address, const char *port,
+create_socket(const char *address, const char *port,
int socktype, int proto, time_t timeout_sec, struct sockaddr_storage *dst)
{
struct addrinfo hints = {
@@ -245,15 +245,15 @@ create_socket(const char *address, const char *port,
struct addrinfo * res;
int error, fd;
- ATF_REQUIRE_EQ_MSG(error = getaddrinfo(address, port, &hints, &res), 0,
+ ATF_REQUIRE_EQ_MSG(error = getaddrinfo(address, port, &hints, &res), 0,
"%s", gai_strerror(error));
/* Make sure there is only one possible bind address */
ATF_REQUIRE_MSG(res->ai_next == NULL, "Ambiguous create_socket args");
- CHECK_ERROR(fd = socket(res->ai_family,
+ CHECK_ERROR(fd = socket(res->ai_family,
res->ai_socktype, res->ai_protocol));
struct timeval timeout = { timeout_sec, 0 };
- CHECK_ERROR(setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
+ CHECK_ERROR(setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeout,
sizeof(timeout)));
memcpy(dst, res->ai_addr, res->ai_addrlen);
freeaddrinfo(res);
@@ -266,7 +266,7 @@ run(const char *prog, char *const *args)
{
pid_t proc;
extern char **environ;
- ATF_REQUIRE_EQ(posix_spawnp(&proc, prog,
+ ATF_REQUIRE_EQ(posix_spawnp(&proc, prog,
NULL, NULL, args, environ), 0);
return proc;
}
@@ -280,7 +280,7 @@ waitfor(pid_t pid, const char *taskname)
ATF_REQUIRE_MSG(rpid == pid, "wait %d != %d %s",
rpid, pid, strerror(errno));
- ATF_REQUIRE_EQ_MSG(WEXITSTATUS(status), EXIT_SUCCESS,
+ ATF_REQUIRE_EQ_MSG(WEXITSTATUS(status), EXIT_SUCCESS,
"%s failed with "
"exit status %d", taskname, WEXITSTATUS(status));
}
diff --git a/usr.sbin/inetd/test_server.c b/usr.sbin/inetd/test_server.c
index cbeffb5de57b..366ace80df26 100644
--- a/usr.sbin/inetd/test_server.c
+++ b/usr.sbin/inetd/test_server.c
@@ -1,4 +1,4 @@
-/* $NetBSD: test_server.c,v 1.2 2021/09/01 06:12:50 christos Exp $ */
+/* $NetBSD: test_server.c,v 1.3 2025/01/05 08:23:33 riastradh Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: test_server.c,v 1.2 2021/09/01 06:12:50 christos Exp $");
+__RCSID("$NetBSD: test_server.c,v 1.3 2025/01/05 08:23:33 riastradh Exp $");
#include <sys/socket.h>
#include <unistd.h>
@@ -77,7 +77,7 @@ main(int argc, char **argv)
} else if (strcmp(argv[1], "stream") == 0) {
if (strcmp(argv[2], "wait") == 0) {
stream_wait_service();
- } else if (strcmp(argv[2], "nowait") == 0) {
+ } else if (strcmp(argv[2], "nowait") == 0) {
stream_nowait_service();
} else {
syslog(LOG_ERR, "Invalid arg %s", argv[2]);
@@ -142,17 +142,17 @@ dgram_wait_service(void)
/* Peek so service can still get the packet */
CHECK(count = recvmsg(0, &header, 0));
- CHECK(sendto(1, buffer, (size_t)count, 0,
+ CHECK(sendto(1, buffer, (size_t)count, 0,
(struct sockaddr*)(&addr), addr.ss_len));
-
- int error = getnameinfo((struct sockaddr*)&addr,
+
+ int error = getnameinfo((struct sockaddr*)&addr,
addr.ss_len, name, NI_MAXHOST,
NULL, 0, NI_NUMERICHOST);
-
+
if (error) {
syslog(LOG_ERR, "getnameinfo error: %s\n", gai_strerror(error));
exit(EXIT_FAILURE);
}
- syslog(LOG_WARNING, "Received dgram/wait message \"%.*s\" from %s\n",
+ syslog(LOG_WARNING, "Received dgram/wait message \"%.*s\" from %s\n",
(int)count, buffer, name);
}
diff --git a/usr.sbin/mtree/t_mtree.sh b/usr.sbin/mtree/t_mtree.sh
index da4e2798d334..5e4177c792a5 100644
--- a/usr.sbin/mtree/t_mtree.sh
+++ b/usr.sbin/mtree/t_mtree.sh
@@ -1,4 +1,4 @@
-# $NetBSD: t_mtree.sh,v 1.8 2017/09/07 04:05:21 nakayama Exp $
+# $NetBSD: t_mtree.sh,v 1.10 2023/12/02 16:18:17 christos Exp $
#
# Copyright (c) 2009, 2012 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -411,6 +411,41 @@ netbsd6_nonemptydir_body()
FLAVOR=netbsd6 nonemptydir_body
}
+atf_test_case mtree_specspec_type
+mtree_specspec_type_head()
+{
+ atf_set "descr" "Test that spec comparisons detect type changes"
+}
+
+mtree_specspec_type_body()
+{
+ mkdir testdir
+
+ touch testdir/bar
+ mtree -c -p testdir > mtree1.spec
+
+ if [ ! -f mtree1.spec ]; then
+ atf_fail "mtree failed"
+ fi
+
+ rm -f testdir/bar
+ ln -s foo testdir/bar
+ # uid change is expected to be ignored as done in -C
+ chown -h operator testdir/bar
+ mtree -c -p testdir > mtree2.spec
+
+ if [ ! -f mtree2.spec ]; then
+ atf_fail "mtree failed"
+ fi
+
+ atf_check -s ignore -o save:output \
+ -x "mtree -f mtree1.spec -f mtree2.spec"
+
+ if ! cut -f 3 output | egrep -q "bar file" || \
+ ! cut -f 3 output | egrep -q "bar link"; then
+ atf_fail "mtree did not detect type change"
+ fi
+}
atf_test_case mtree_onlyfile
atf_test_case netbsd6_onlyfile
@@ -459,6 +494,7 @@ atf_init_test_cases()
atf_add_test_case mtree_ignore
atf_add_test_case mtree_merge
atf_add_test_case mtree_nonemptydir
+ atf_add_test_case mtree_specspec_type
atf_add_test_case mtree_onlyfile
atf_add_test_case netbsd6_create