blob: fba67de4033d9f484bc222d5db1d2a26649d04cd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// compile-flags: -Zmir-opt-level=1 -Zunsound-mir-opts
// ignore-test
// FIXME: the pass is unsound and causes ICEs in the MIR validator
// EMIT_MIR simplify_try_if_let.{impl#0}-append.SimplifyArmIdentity.diff
use std::ptr::NonNull;
pub struct LinkedList {
head: Option<NonNull<Node>>,
tail: Option<NonNull<Node>>,
}
pub struct Node {
next: Option<NonNull<Node>>,
}
impl LinkedList {
pub fn new() -> Self {
Self { head: None, tail: None }
}
pub fn append(&mut self, other: &mut Self) {
match self.tail {
None => {}
Some(mut tail) => {
// `as_mut` is okay here because we have exclusive access to the entirety
// of both lists.
if let Some(other_head) = other.head.take() {
unsafe {
tail.as_mut().next = Some(other_head);
}
}
}
}
}
}
fn main() {
let mut one = LinkedList::new();
let mut two = LinkedList::new();
one.append(&mut two);
}
|