[INFO] fetching crate subway 0.1.2... [INFO] linting subway-0.1.2 against nightly for clippy-nonminimal_bool-denied [INFO] extracting crate subway 0.1.2 into /workspace/builds/worker-5-tc1/source [INFO] started tweaking crates.io crate subway 0.1.2 [INFO] finished tweaking crates.io crate subway 0.1.2 [INFO] tweaked toml for crates.io crate subway 0.1.2 written to /workspace/builds/worker-5-tc1/source/Cargo.toml [INFO] validating manifest of crates.io crate subway 0.1.2 on toolchain nightly [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "generate-lockfile" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Locking 10 packages to latest compatible versions [INFO] [stderr] Adding rand v0.5.6 (available: v0.10.0) [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+nightly" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded rand v0.5.6 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 8f68da359cbfc7460a163f12eaaa5d0a5cad4bcf87aebef80273fda06065a874 [INFO] running `Command { std: "docker" "start" "-a" "8f68da359cbfc7460a163f12eaaa5d0a5cad4bcf87aebef80273fda06065a874", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "8f68da359cbfc7460a163f12eaaa5d0a5cad4bcf87aebef80273fda06065a874", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "8f68da359cbfc7460a163f12eaaa5d0a5cad4bcf87aebef80273fda06065a874", kill_on_drop: false }` [INFO] [stdout] 8f68da359cbfc7460a163f12eaaa5d0a5cad4bcf87aebef80273fda06065a874 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-5-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+nightly" "clippy" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 2371ab5a9c34063c44beed5c76775e239aa6976d0f3b0549a575fcd2adcfe21f [INFO] running `Command { std: "docker" "start" "-a" "2371ab5a9c34063c44beed5c76775e239aa6976d0f3b0549a575fcd2adcfe21f", kill_on_drop: false }` [INFO] [stderr] Checking rand_core v0.4.2 [INFO] [stderr] Checking rand_core v0.3.1 [INFO] [stderr] Checking rand v0.5.6 [INFO] [stderr] Checking subway v0.1.2 (/opt/rustwide/workdir) [INFO] [stdout] warning: method `print` is never used [INFO] [stdout] --> src/skiplist.rs:574:8 [INFO] [stdout] | [INFO] [stdout] 266 | / impl SkipList [INFO] [stdout] 267 | | where [INFO] [stdout] 268 | | K: Ord + Clone + Display, [INFO] [stdout] 269 | | V: Clone, [INFO] [stdout] | |_____________- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 574 | fn print(&self) { [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_marker` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:79:26 [INFO] [stdout] | [INFO] [stdout] 78 | if maybe_marker.is_some() { [INFO] [stdout] | ------------------------- help: try: `if let Some() = maybe_marker` [INFO] [stdout] 79 | let marker = maybe_marker.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:119:9 [INFO] [stdout] | [INFO] [stdout] 119 | return prev; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 119 - return prev; [INFO] [stdout] 119 + prev [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_prev_head_ref` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:143:41 [INFO] [stdout] | [INFO] [stdout] 142 | if maybe_prev_head_ref.is_some() { [INFO] [stdout] | -------------------------------- help: try: `if let Some() = maybe_prev_head_ref` [INFO] [stdout] 143 | let prev_head_ref = maybe_prev_head_ref.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_next_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:160:37 [INFO] [stdout] | [INFO] [stdout] 158 | if maybe_next_node.is_some() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = maybe_next_node` [INFO] [stdout] 159 | // handle insert in the middle [INFO] [stdout] 160 | let next_node = maybe_next_node.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:137:9 [INFO] [stdout] | [INFO] [stdout] 137 | / return match maybe_prev_node { [INFO] [stdout] 138 | | // insert at head [INFO] [stdout] 139 | | None => { [INFO] [stdout] 140 | | let maybe_prev_head_ref: Option>>> = [INFO] [stdout] ... | [INFO] [stdout] 174 | | }; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 137 ~ match maybe_prev_node { [INFO] [stdout] 138 + // insert at head [INFO] [stdout] 139 + None => { [INFO] [stdout] 140 + let maybe_prev_head_ref: Option>>> = [INFO] [stdout] 141 + self.head.as_ref().map(Rc::clone); [INFO] [stdout] 142 + if maybe_prev_head_ref.is_some() { [INFO] [stdout] 143 + let prev_head_ref = maybe_prev_head_ref.unwrap(); [INFO] [stdout] 144 + let new_head = Rc::new(RefCell::new(Node::new(key, value))); [INFO] [stdout] 145 + new_head.borrow_mut().right = self.head.take(); [INFO] [stdout] 146 + self.head = Some(new_head); [INFO] [stdout] 147 + prev_head_ref.borrow_mut().left = self.head.as_ref().map(Rc::downgrade); [INFO] [stdout] 148 + } else { [INFO] [stdout] 149 + self.head = Some(Rc::new(RefCell::new(Node::new(key, value)))); [INFO] [stdout] 150 + } [INFO] [stdout] 151 + self.size += 1; [INFO] [stdout] 152 + Rc::clone(self.head.as_ref().unwrap()) [INFO] [stdout] 153 + } [INFO] [stdout] 154 + Some(prev_node) => { [INFO] [stdout] 155 + let maybe_next_node: Option>>> = [INFO] [stdout] 156 + prev_node.borrow().right.as_ref().map(Rc::clone); [INFO] [stdout] 157 + let new_node = Rc::new(RefCell::new(Node::new(key, value))); [INFO] [stdout] 158 + if maybe_next_node.is_some() { [INFO] [stdout] 159 + // handle insert in the middle [INFO] [stdout] 160 + let next_node = maybe_next_node.unwrap(); [INFO] [stdout] 161 + next_node.borrow_mut().left = Some(Rc::downgrade(&new_node)); [INFO] [stdout] 162 + new_node.borrow_mut().right = prev_node.borrow_mut().right.take(); [INFO] [stdout] 163 + new_node.borrow_mut().left = Some(Rc::downgrade(&prev_node)); [INFO] [stdout] 164 + prev_node.borrow_mut().right = Some(new_node); [INFO] [stdout] 165 + self.size += 1; [INFO] [stdout] 166 + } else { [INFO] [stdout] 167 + // handle insert at tail [INFO] [stdout] 168 + new_node.borrow_mut().left = Some(Rc::downgrade(&prev_node)); [INFO] [stdout] 169 + prev_node.borrow_mut().right = Some(new_node); [INFO] [stdout] 170 + self.size += 1; [INFO] [stdout] 171 + } [INFO] [stdout] 172 + Rc::clone(prev_node.borrow().right.as_ref().unwrap()) [INFO] [stdout] 173 + } [INFO] [stdout] 174 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_next_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:190:29 [INFO] [stdout] | [INFO] [stdout] 189 | if maybe_next_node.is_some() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = maybe_next_node` [INFO] [stdout] 190 | let next_node = maybe_next_node.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:207:29 [INFO] [stdout] | [INFO] [stdout] 206 | if maybe_node.is_some() { [INFO] [stdout] | ----------------------- help: try: `if let Some() = &maybe_node` [INFO] [stdout] 207 | let to_delete = maybe_node.as_ref().unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_prev_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:210:58 [INFO] [stdout] | [INFO] [stdout] 209 | if maybe_prev_node.is_some() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = maybe_prev_node` [INFO] [stdout] 210 | let prev_node: Rc>> = maybe_prev_node.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_new_next` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:214:36 [INFO] [stdout] | [INFO] [stdout] 213 | if maybe_new_next.is_some() { [INFO] [stdout] | --------------------------- help: try: `if let Some() = maybe_new_next` [INFO] [stdout] 214 | let new_next = maybe_new_next.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_current` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:238:27 [INFO] [stdout] | [INFO] [stdout] 237 | if maybe_current.is_some() { [INFO] [stdout] | -------------------------- help: try: `if let Some() = maybe_current` [INFO] [stdout] 238 | let current = maybe_current.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you should consider adding a `Default` implementation for `SkipList` [INFO] [stdout] --> src/skiplist.rs:279:5 [INFO] [stdout] | [INFO] [stdout] 279 | / pub fn new() -> SkipList { [INFO] [stdout] 280 | | let levels = vec![Level::new()]; [INFO] [stdout] 281 | | SkipList { size: 0, levels } [INFO] [stdout] 282 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stdout] = note: `#[warn(clippy::new_without_default)]` on by default [INFO] [stdout] help: try adding this [INFO] [stdout] | [INFO] [stdout] 266 + impl Default for SkipList [INFO] [stdout] 267 + where [INFO] [stdout] 268 + K: Ord + Clone + Display, [INFO] [stdout] 269 + V: Clone, [INFO] [stdout] 270 + { [INFO] [stdout] 271 + fn default() -> Self { [INFO] [stdout] 272 + Self::new() [INFO] [stdout] 273 + } [INFO] [stdout] 274 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: doc list item overindented [INFO] [stdout] --> src/skiplist.rs:288:9 [INFO] [stdout] | [INFO] [stdout] 288 | /// This is also used as the sort key. [INFO] [stdout] | ^^^^^^^^^^^^ help: try using ` ` (2 spaces) [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#doc_overindented_list_items [INFO] [stdout] = note: `#[warn(clippy::doc_overindented_list_items)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/skiplist.rs:303:12 [INFO] [stdout] | [INFO] [stdout] 303 | if self.levels.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.levels.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/skiplist.rs:307:13 [INFO] [stdout] | [INFO] [stdout] 307 | / match insertion_path.get(0).unwrap() { [INFO] [stdout] 308 | | Insertion::Before => { [INFO] [stdout] 309 | | is_head = true; [INFO] [stdout] ... | [INFO] [stdout] 312 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 307 ~ if let Insertion::Before = insertion_path.get(0).unwrap() { [INFO] [stdout] 308 + is_head = true; [INFO] [stdout] 309 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: accessing first element with `insertion_path.get(0)` [INFO] [stdout] --> src/skiplist.rs:307:19 [INFO] [stdout] | [INFO] [stdout] 307 | match insertion_path.get(0).unwrap() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: try: `insertion_path.first()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first [INFO] [stdout] = note: `#[warn(clippy::get_first)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:509:9 [INFO] [stdout] | [INFO] [stdout] 509 | / return match insertion { [INFO] [stdout] 510 | | Insertion::Before => { [INFO] [stdout] 511 | | let new_head = self.levels[level].insert(key.clone(), value.clone()); [INFO] [stdout] 512 | | Rc::clone(&new_head) [INFO] [stdout] ... | [INFO] [stdout] 519 | | }; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 509 ~ match insertion { [INFO] [stdout] 510 + Insertion::Before => { [INFO] [stdout] 511 + let new_head = self.levels[level].insert(key.clone(), value.clone()); [INFO] [stdout] 512 + Rc::clone(&new_head) [INFO] [stdout] 513 + } [INFO] [stdout] 514 + Insertion::After(node) => { [INFO] [stdout] 515 + let new_node = [INFO] [stdout] 516 + self.levels[level].insert_after(key.clone(), value.clone(), Rc::clone(node)); [INFO] [stdout] 517 + Rc::clone(&new_node) [INFO] [stdout] 518 + } [INFO] [stdout] 519 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `head` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:530:32 [INFO] [stdout] | [INFO] [stdout] 529 | if head.is_some() { [INFO] [stdout] | ----------------- help: try: `if let Some() = head` [INFO] [stdout] 530 | let head_ref = head.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:571:9 [INFO] [stdout] | [INFO] [stdout] 571 | return random > 0.50; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 571 - return random > 0.50; [INFO] [stdout] 571 + random > 0.50 [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: method `print` is never used [INFO] [stdout] --> src/skiplist.rs:574:8 [INFO] [stdout] | [INFO] [stdout] 266 | / impl SkipList [INFO] [stdout] 267 | | where [INFO] [stdout] 268 | | K: Ord + Clone + Display, [INFO] [stdout] 269 | | V: Clone, [INFO] [stdout] | |_____________- method in this implementation [INFO] [stdout] ... [INFO] [stdout] 574 | fn print(&self) { [INFO] [stdout] | ^^^^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_marker` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:79:26 [INFO] [stdout] | [INFO] [stdout] 78 | if maybe_marker.is_some() { [INFO] [stdout] | ------------------------- help: try: `if let Some() = maybe_marker` [INFO] [stdout] 79 | let marker = maybe_marker.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] = note: `#[warn(clippy::unnecessary_unwrap)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:119:9 [INFO] [stdout] | [INFO] [stdout] 119 | return prev; [INFO] [stdout] | ^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] = note: `#[warn(clippy::needless_return)]` on by default [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 119 - return prev; [INFO] [stdout] 119 + prev [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_prev_head_ref` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:143:41 [INFO] [stdout] | [INFO] [stdout] 142 | if maybe_prev_head_ref.is_some() { [INFO] [stdout] | -------------------------------- help: try: `if let Some() = maybe_prev_head_ref` [INFO] [stdout] 143 | let prev_head_ref = maybe_prev_head_ref.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_next_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:160:37 [INFO] [stdout] | [INFO] [stdout] 158 | if maybe_next_node.is_some() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = maybe_next_node` [INFO] [stdout] 159 | // handle insert in the middle [INFO] [stdout] 160 | let next_node = maybe_next_node.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:137:9 [INFO] [stdout] | [INFO] [stdout] 137 | / return match maybe_prev_node { [INFO] [stdout] 138 | | // insert at head [INFO] [stdout] 139 | | None => { [INFO] [stdout] 140 | | let maybe_prev_head_ref: Option>>> = [INFO] [stdout] ... | [INFO] [stdout] 174 | | }; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 137 ~ match maybe_prev_node { [INFO] [stdout] 138 + // insert at head [INFO] [stdout] 139 + None => { [INFO] [stdout] 140 + let maybe_prev_head_ref: Option>>> = [INFO] [stdout] 141 + self.head.as_ref().map(Rc::clone); [INFO] [stdout] 142 + if maybe_prev_head_ref.is_some() { [INFO] [stdout] 143 + let prev_head_ref = maybe_prev_head_ref.unwrap(); [INFO] [stdout] 144 + let new_head = Rc::new(RefCell::new(Node::new(key, value))); [INFO] [stdout] 145 + new_head.borrow_mut().right = self.head.take(); [INFO] [stdout] 146 + self.head = Some(new_head); [INFO] [stdout] 147 + prev_head_ref.borrow_mut().left = self.head.as_ref().map(Rc::downgrade); [INFO] [stdout] 148 + } else { [INFO] [stdout] 149 + self.head = Some(Rc::new(RefCell::new(Node::new(key, value)))); [INFO] [stdout] 150 + } [INFO] [stdout] 151 + self.size += 1; [INFO] [stdout] 152 + Rc::clone(self.head.as_ref().unwrap()) [INFO] [stdout] 153 + } [INFO] [stdout] 154 + Some(prev_node) => { [INFO] [stdout] 155 + let maybe_next_node: Option>>> = [INFO] [stdout] 156 + prev_node.borrow().right.as_ref().map(Rc::clone); [INFO] [stdout] 157 + let new_node = Rc::new(RefCell::new(Node::new(key, value))); [INFO] [stdout] 158 + if maybe_next_node.is_some() { [INFO] [stdout] 159 + // handle insert in the middle [INFO] [stdout] 160 + let next_node = maybe_next_node.unwrap(); [INFO] [stdout] 161 + next_node.borrow_mut().left = Some(Rc::downgrade(&new_node)); [INFO] [stdout] 162 + new_node.borrow_mut().right = prev_node.borrow_mut().right.take(); [INFO] [stdout] 163 + new_node.borrow_mut().left = Some(Rc::downgrade(&prev_node)); [INFO] [stdout] 164 + prev_node.borrow_mut().right = Some(new_node); [INFO] [stdout] 165 + self.size += 1; [INFO] [stdout] 166 + } else { [INFO] [stdout] 167 + // handle insert at tail [INFO] [stdout] 168 + new_node.borrow_mut().left = Some(Rc::downgrade(&prev_node)); [INFO] [stdout] 169 + prev_node.borrow_mut().right = Some(new_node); [INFO] [stdout] 170 + self.size += 1; [INFO] [stdout] 171 + } [INFO] [stdout] 172 + Rc::clone(prev_node.borrow().right.as_ref().unwrap()) [INFO] [stdout] 173 + } [INFO] [stdout] 174 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_next_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:190:29 [INFO] [stdout] | [INFO] [stdout] 189 | if maybe_next_node.is_some() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = maybe_next_node` [INFO] [stdout] 190 | let next_node = maybe_next_node.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:207:29 [INFO] [stdout] | [INFO] [stdout] 206 | if maybe_node.is_some() { [INFO] [stdout] | ----------------------- help: try: `if let Some() = &maybe_node` [INFO] [stdout] 207 | let to_delete = maybe_node.as_ref().unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_prev_node` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:210:58 [INFO] [stdout] | [INFO] [stdout] 209 | if maybe_prev_node.is_some() { [INFO] [stdout] | ---------------------------- help: try: `if let Some() = maybe_prev_node` [INFO] [stdout] 210 | let prev_node: Rc>> = maybe_prev_node.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_new_next` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:214:36 [INFO] [stdout] | [INFO] [stdout] 213 | if maybe_new_next.is_some() { [INFO] [stdout] | --------------------------- help: try: `if let Some() = maybe_new_next` [INFO] [stdout] 214 | let new_next = maybe_new_next.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `maybe_current` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:238:27 [INFO] [stdout] | [INFO] [stdout] 237 | if maybe_current.is_some() { [INFO] [stdout] | -------------------------- help: try: `if let Some() = maybe_current` [INFO] [stdout] 238 | let current = maybe_current.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you should consider adding a `Default` implementation for `SkipList` [INFO] [stdout] --> src/skiplist.rs:279:5 [INFO] [stdout] | [INFO] [stdout] 279 | / pub fn new() -> SkipList { [INFO] [stdout] 280 | | let levels = vec![Level::new()]; [INFO] [stdout] 281 | | SkipList { size: 0, levels } [INFO] [stdout] 282 | | } [INFO] [stdout] | |_____^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#new_without_default [INFO] [stdout] = note: `#[warn(clippy::new_without_default)]` on by default [INFO] [stdout] help: try adding this [INFO] [stdout] | [INFO] [stdout] 266 + impl Default for SkipList [INFO] [stdout] 267 + where [INFO] [stdout] 268 + K: Ord + Clone + Display, [INFO] [stdout] 269 + V: Clone, [INFO] [stdout] 270 + { [INFO] [stdout] 271 + fn default() -> Self { [INFO] [stdout] 272 + Self::new() [INFO] [stdout] 273 + } [INFO] [stdout] 274 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: doc list item overindented [INFO] [stdout] --> src/skiplist.rs:288:9 [INFO] [stdout] | [INFO] [stdout] 288 | /// This is also used as the sort key. [INFO] [stdout] | ^^^^^^^^^^^^ help: try using ` ` (2 spaces) [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#doc_overindented_list_items [INFO] [stdout] = note: `#[warn(clippy::doc_overindented_list_items)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: length comparison to zero [INFO] [stdout] --> src/skiplist.rs:303:12 [INFO] [stdout] | [INFO] [stdout] 303 | if self.levels.len() > 0 { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: using `!is_empty` is clearer and more explicit: `!self.levels.is_empty()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#len_zero [INFO] [stdout] = note: `#[warn(clippy::len_zero)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let` [INFO] [stdout] --> src/skiplist.rs:307:13 [INFO] [stdout] | [INFO] [stdout] 307 | / match insertion_path.get(0).unwrap() { [INFO] [stdout] 308 | | Insertion::Before => { [INFO] [stdout] 309 | | is_head = true; [INFO] [stdout] ... | [INFO] [stdout] 312 | | } [INFO] [stdout] | |_____________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#single_match [INFO] [stdout] = note: `#[warn(clippy::single_match)]` on by default [INFO] [stdout] help: try [INFO] [stdout] | [INFO] [stdout] 307 ~ if let Insertion::Before = insertion_path.get(0).unwrap() { [INFO] [stdout] 308 + is_head = true; [INFO] [stdout] 309 + } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: accessing first element with `insertion_path.get(0)` [INFO] [stdout] --> src/skiplist.rs:307:19 [INFO] [stdout] | [INFO] [stdout] 307 | match insertion_path.get(0).unwrap() { [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^^ help: try: `insertion_path.first()` [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#get_first [INFO] [stdout] = note: `#[warn(clippy::get_first)]` on by default [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:509:9 [INFO] [stdout] | [INFO] [stdout] 509 | / return match insertion { [INFO] [stdout] 510 | | Insertion::Before => { [INFO] [stdout] 511 | | let new_head = self.levels[level].insert(key.clone(), value.clone()); [INFO] [stdout] 512 | | Rc::clone(&new_head) [INFO] [stdout] ... | [INFO] [stdout] 519 | | }; [INFO] [stdout] | |_________^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 509 ~ match insertion { [INFO] [stdout] 510 + Insertion::Before => { [INFO] [stdout] 511 + let new_head = self.levels[level].insert(key.clone(), value.clone()); [INFO] [stdout] 512 + Rc::clone(&new_head) [INFO] [stdout] 513 + } [INFO] [stdout] 514 + Insertion::After(node) => { [INFO] [stdout] 515 + let new_node = [INFO] [stdout] 516 + self.levels[level].insert_after(key.clone(), value.clone(), Rc::clone(node)); [INFO] [stdout] 517 + Rc::clone(&new_node) [INFO] [stdout] 518 + } [INFO] [stdout] 519 ~ } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: called `unwrap` on `head` after checking its variant with `is_some` [INFO] [stdout] --> src/skiplist.rs:530:32 [INFO] [stdout] | [INFO] [stdout] 529 | if head.is_some() { [INFO] [stdout] | ----------------- help: try: `if let Some() = head` [INFO] [stdout] 530 | let head_ref = head.unwrap(); [INFO] [stdout] | ^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unnecessary_unwrap [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unneeded `return` statement [INFO] [stdout] --> src/skiplist.rs:571:9 [INFO] [stdout] | [INFO] [stdout] 571 | return random > 0.50; [INFO] [stdout] | ^^^^^^^^^^^^^^^^^^^^ [INFO] [stdout] | [INFO] [stdout] = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return [INFO] [stdout] help: remove `return` [INFO] [stdout] | [INFO] [stdout] 571 - return random > 0.50; [INFO] [stdout] 571 + random > 0.50 [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.66s [INFO] running `Command { std: "docker" "inspect" "2371ab5a9c34063c44beed5c76775e239aa6976d0f3b0549a575fcd2adcfe21f", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "2371ab5a9c34063c44beed5c76775e239aa6976d0f3b0549a575fcd2adcfe21f", kill_on_drop: false }` [INFO] [stdout] 2371ab5a9c34063c44beed5c76775e239aa6976d0f3b0549a575fcd2adcfe21f