diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f4116c1a..d124b543 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,14 +24,7 @@ jobs: - run: rustup component add rustfmt clippy - run: cargo fetch - run: cargo fmt -- --check --color always - - name: cargo clippy - run: | - if [ "$RUNNER_OS" == "Windows" ]; then - cargo clippy --all-targets --all-features - else - make lint - fi - shell: bash + - run: cargo clippy --all-targets --all-features - run: cargo test --release # cli: diff --git a/corcovado/src/io.rs b/corcovado/src/io.rs index 48b3bdae..c48367e2 100644 --- a/corcovado/src/io.rs +++ b/corcovado/src/io.rs @@ -1,6 +1,9 @@ // Re-export the io::Result / Error types for convenience // pub use std::io::{Error, ErrorKind, Read, Result, Write}; -pub use std::io::{ErrorKind, Result}; + +pub use std::io::Result; +#[cfg(not(target_os = "windows"))] +pub use std::io::ErrorKind; // TODO: Delete this /// A helper trait to provide the map_non_block function on Results. diff --git a/corcovado/src/sys/mod.rs b/corcovado/src/sys/mod.rs index cfd989a5..2698898e 100644 --- a/corcovado/src/sys/mod.rs +++ b/corcovado/src/sys/mod.rs @@ -10,7 +10,7 @@ pub mod unix; #[cfg(windows)] pub use self::windows::{ - Awakener, Binding, Events, Overlapped, Selector, TcpListener, TcpStream, UdpSocket, + Awakener, Binding, Events, Overlapped, Selector, }; #[cfg(windows)] diff --git a/corcovado/src/sys/windows/from_raw_arc.rs b/corcovado/src/sys/windows/from_raw_arc.rs index f03a5d6b..8274ce69 100644 --- a/corcovado/src/sys/windows/from_raw_arc.rs +++ b/corcovado/src/sys/windows/from_raw_arc.rs @@ -43,7 +43,7 @@ impl FromRawArc { cnt: AtomicUsize::new(1), }); FromRawArc { - _inner: unsafe { mem::transmute(x) }, + _inner: unsafe { mem::transmute::>, *mut Inner>(x) }, } } @@ -87,7 +87,7 @@ impl Drop for FromRawArc { return; } atomic::fence(Ordering::Acquire); - drop(mem::transmute::<_, Box>(self._inner)); + drop(mem::transmute::<*mut Inner, Box>(self._inner)); } } } diff --git a/corcovado/src/sys/windows/mod.rs b/corcovado/src/sys/windows/mod.rs index f4718b8f..85b6eaeb 100644 --- a/corcovado/src/sys/windows/mod.rs +++ b/corcovado/src/sys/windows/mod.rs @@ -154,8 +154,6 @@ mod udp; pub use self::awakener::Awakener; pub use self::selector::{Binding, Events, Overlapped, Selector}; -pub use self::tcp::{TcpListener, TcpStream}; -pub use self::udp::UdpSocket; #[derive(Copy, Clone)] #[allow(dead_code)] diff --git a/corcovado/src/sys/windows/selector.rs b/corcovado/src/sys/windows/selector.rs index 40784054..04ca0ba6 100644 --- a/corcovado/src/sys/windows/selector.rs +++ b/corcovado/src/sys/windows/selector.rs @@ -506,10 +506,9 @@ macro_rules! overlapped2arc { }) } -#[allow(deref_nullptr)] macro_rules! offset_of { ($t:ty, $($field:ident).+) => ( - &(*(0 as *const $t)).$($field).+ as *const _ as usize + &(*(std::ptr::null::<$t>())).$($field).+ as *const _ as usize ) } diff --git a/corcovado/src/sys/windows/tcp.rs b/corcovado/src/sys/windows/tcp.rs index 6bc8b070..5212a78a 100644 --- a/corcovado/src/sys/windows/tcp.rs +++ b/corcovado/src/sys/windows/tcp.rs @@ -565,6 +565,7 @@ impl StreamImp { fn read_done(status: &OVERLAPPED_ENTRY) { let status = CompletionStatus::from_entry(status); let me2 = StreamImp { + #[allow(deref_nullptr)] inner: unsafe { overlapped2arc!(status.overlapped(), StreamIo, read) }, }; @@ -604,6 +605,7 @@ fn write_done(status: &OVERLAPPED_ENTRY) { let status = CompletionStatus::from_entry(status); trace!("finished a write {}", status.bytes_transferred()); let me2 = StreamImp { + #[allow(deref_nullptr)] inner: unsafe { overlapped2arc!(status.overlapped(), StreamIo, write) }, }; let mut me = me2.inner(); @@ -857,6 +859,7 @@ impl ListenerImp { fn accept_done(status: &OVERLAPPED_ENTRY) { let status = CompletionStatus::from_entry(status); let me2 = ListenerImp { + #[allow(deref_nullptr)] inner: unsafe { overlapped2arc!(status.overlapped(), ListenerIo, accept) }, }; diff --git a/corcovado/src/sys/windows/udp.rs b/corcovado/src/sys/windows/udp.rs index c4f9e455..9585dcd4 100644 --- a/corcovado/src/sys/windows/udp.rs +++ b/corcovado/src/sys/windows/udp.rs @@ -442,6 +442,7 @@ fn send_done(status: &OVERLAPPED_ENTRY) { let status = CompletionStatus::from_entry(status); trace!("finished a send {}", status.bytes_transferred()); let me2 = Imp { + #[allow(deref_nullptr)] inner: unsafe { overlapped2arc!(status.overlapped(), Io, write) }, }; let mut me = me2.inner(); @@ -453,6 +454,7 @@ fn recv_done(status: &OVERLAPPED_ENTRY) { let status = CompletionStatus::from_entry(status); trace!("finished a recv {}", status.bytes_transferred()); let me2 = Imp { + #[allow(deref_nullptr)] inner: unsafe { overlapped2arc!(status.overlapped(), Io, read) }, }; let mut me = me2.inner(); diff --git a/frontends/rioterm/src/context.rs b/frontends/rioterm/src/context.rs index e8ab9d94..93ef66ce 100644 --- a/frontends/rioterm/src/context.rs +++ b/frontends/rioterm/src/context.rs @@ -45,6 +45,7 @@ impl Drop for Context { #[derive(Clone, Default)] pub struct ContextManagerConfig { pub shell: Shell, + #[cfg(not(target_os = "windows"))] pub use_fork: bool, pub working_dir: Option, pub spawn_performer: bool, @@ -313,6 +314,7 @@ impl ContextManager { window_id: WindowId, ) -> Result> { let config = ContextManagerConfig { + #[cfg(not(target_os = "windows"))] use_fork: true, working_dir: None, shell: Shell { @@ -557,7 +559,7 @@ impl ContextManager { if self.titles.last_title_update.elapsed() > Duration::from_secs(2) { self.titles.last_title_update = Instant::now(); let mut id = String::from(""); - for (i, context) in self.contexts.iter_mut().enumerate() { + for (i, _context) in self.contexts.iter().enumerate() { let program = self.config.shell.program.to_owned(); let empty_string = String::from(""); @@ -686,10 +688,10 @@ impl ContextManager { ) { let mut working_dir = None; if self.config.use_current_path && self.config.working_dir.is_none() { - let current_context = self.current(); #[cfg(not(target_os = "windows"))] { + let current_context = self.current(); if let Ok(path) = teletypewriter::foreground_process_path( *current_context.main_fd, current_context.shell_pid, diff --git a/frontends/rioterm/src/screen/mod.rs b/frontends/rioterm/src/screen/mod.rs index b5c95f6f..b8644ea1 100644 --- a/frontends/rioterm/src/screen/mod.rs +++ b/frontends/rioterm/src/screen/mod.rs @@ -200,6 +200,7 @@ impl Screen<'_> { shell, working_dir, spawn_performer: true, + #[cfg(not(target_os = "windows"))] use_fork: config.use_fork, is_native, // When navigation is collapsed and does not contain any color rule diff --git a/rio-window/src/platform_impl/windows/raw_input.rs b/rio-window/src/platform_impl/windows/raw_input.rs index e206cbc6..86cc8fc3 100644 --- a/rio-window/src/platform_impl/windows/raw_input.rs +++ b/rio-window/src/platform_impl/windows/raw_input.rs @@ -309,6 +309,7 @@ pub fn get_keyboard_physical_key(keyboard: RAWKEYBOARD) -> Option { scancode_to_physicalkey(scancode as u32) }; if keyboard.VKey == VK_SHIFT { + #[allow(clippy::collapsible_match)] if let PhysicalKey::Code(code) = physical_key { match code { KeyCode::NumpadDecimal diff --git a/teletypewriter/src/windows/mod.rs b/teletypewriter/src/windows/mod.rs index 43537f10..5eb44998 100644 --- a/teletypewriter/src/windows/mod.rs +++ b/teletypewriter/src/windows/mod.rs @@ -38,7 +38,7 @@ pub fn create_pty( working_directory: &Option, columns: u16, rows: u16, -) -> Result { +) -> Result { let exec = if !args.is_empty() { let args = args.join(" "); &format!("{shell} {args}") diff --git a/teletypewriter/src/windows/spsc.rs b/teletypewriter/src/windows/spsc.rs index 18b341e7..8dbc1ca4 100644 --- a/teletypewriter/src/windows/spsc.rs +++ b/teletypewriter/src/windows/spsc.rs @@ -1,10 +1,10 @@ // Single-producer single-consumer buffer for Rust +use std::rc::Rc; use std::cell::UnsafeCell; use std::io::{self, Read, Write}; use std::mem; use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::Arc; struct SpscBuffer { buf: UnsafeCell>, @@ -39,7 +39,7 @@ impl SpscBuffer { /// Consumer of the ringbuffer. pub struct SpscBufferReader { start: usize, - buffer: Arc, + buffer: Rc, } impl SpscBufferReader { @@ -62,6 +62,7 @@ impl SpscBufferReader { } /// Check whether the buffer is currently empty + #[allow(unused)] pub fn is_full(&self) -> bool { self.buffer.is_full() } @@ -70,6 +71,7 @@ impl SpscBufferReader { pub fn read_to_slice(&mut self, buf: &mut [u8]) -> usize { use std::cmp::min; + #[allow(clippy::transmute_ptr_to_ref)] let ringbuf: &mut Box<[u8]> = unsafe { mem::transmute(self.buffer.buf.get()) }; let ringbuf_capacity = ringbuf.len(); @@ -100,7 +102,7 @@ unsafe impl Send for SpscBufferReader {} /// Producer for the ringbuffer pub struct SpscBufferWriter { end: usize, - buffer: Arc, + buffer: Rc, } impl SpscBufferWriter { @@ -131,6 +133,7 @@ impl SpscBufferWriter { pub fn write_from_slice(&mut self, buf: &[u8]) -> usize { use std::cmp::min; + #[allow(clippy::transmute_ptr_to_ref)] let ringbuf: &mut Box<[u8]> = unsafe { mem::transmute(self.buffer.buf.get()) }; let ringbuf_capacity = ringbuf.len(); @@ -174,7 +177,7 @@ impl Write for SpscBufferWriter { /// /// See the mio-anonymous-pipes crate for example usage. pub fn spsc_buffer(size: usize) -> (SpscBufferWriter, SpscBufferReader) { - let buffer = Arc::new(SpscBuffer::new(size)); + let buffer = Rc::new(SpscBuffer::new(size)); let producer = SpscBufferWriter { end: 0,