Skip to content

Commit 7aaef6a

Browse files
committed
Access the node pointers multiple time in the same expr
1 parent 9d4741b commit 7aaef6a

3 files changed

Lines changed: 454 additions & 0 deletions

File tree

tests/unit/doubly_linked_list.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ int main() {
8686
head = Delete(head, 0);
8787
head = Delete(head, -2);
8888
Node *tail = Tail(head);
89+
8990
assert(Find(head, 0)->val == 4);
9091
assert(Find(head, 1)->val == 3);
9192
assert(Find(head, 2)->val == 2);
@@ -98,5 +99,25 @@ int main() {
9899
assert(FindBack(tail, 3)->val == 3);
99100
assert(FindBack(tail, 4)->val == 4);
100101
assert(FindBack(tail, 4)->prev == nullptr);
102+
103+
assert(Find(head, 0)->next->val == 3);
104+
assert(Find(head, 1)->next->next->val == 1);
105+
assert(Find(head, 2)->prev->val == 3);
106+
assert(Find(head, 4)->next == nullptr);
107+
assert(FindBack(tail, 1)->prev->prev->val == 3);
108+
109+
Find(head, 0)->next->val = 30;
110+
assert(Find(head, 1)->val == 30);
111+
Find(head, 1)->next->val = Find(head, 0)->val + Find(head, 3)->val;
112+
assert(Find(head, 2)->val == 4 + 1);
113+
114+
int sum = Find(head, 0)->val + Find(head, 1)->val + Find(head, 2)->val +
115+
Find(head, 3)->val + Find(head, 4)->val;
116+
assert(sum == 4 + 30 + 5 + 1 + -1);
117+
118+
assert(Find(head, 0)->val + FindBack(tail, 0)->val == 4 + -1);
119+
assert(Find(head, 2)->next->val == FindBack(tail, 1)->val);
120+
assert(Find(head, 0)->prev == FindBack(tail, 4)->prev);
121+
101122
return 0;
102123
}

tests/unit/out/refcount/doubly_linked_list.rs

Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,5 +355,271 @@ fn main_0() -> i32 {
355355
.prev
356356
.borrow())
357357
.is_null());
358+
assert!(
359+
((*(*(*(*({
360+
let _head: Ptr<Node> = (*head.borrow()).clone();
361+
let _idx: i32 = 0;
362+
Find_0(_head, _idx)
363+
})
364+
.upgrade()
365+
.deref())
366+
.next
367+
.borrow())
368+
.upgrade()
369+
.deref())
370+
.val
371+
.borrow())
372+
== 3)
373+
);
374+
assert!(
375+
((*(*(*(*(*(*({
376+
let _head: Ptr<Node> = (*head.borrow()).clone();
377+
let _idx: i32 = 1;
378+
Find_0(_head, _idx)
379+
})
380+
.upgrade()
381+
.deref())
382+
.next
383+
.borrow())
384+
.upgrade()
385+
.deref())
386+
.next
387+
.borrow())
388+
.upgrade()
389+
.deref())
390+
.val
391+
.borrow())
392+
== 1)
393+
);
394+
assert!(
395+
((*(*(*(*({
396+
let _head: Ptr<Node> = (*head.borrow()).clone();
397+
let _idx: i32 = 2;
398+
Find_0(_head, _idx)
399+
})
400+
.upgrade()
401+
.deref())
402+
.prev
403+
.borrow())
404+
.upgrade()
405+
.deref())
406+
.val
407+
.borrow())
408+
== 3)
409+
);
410+
assert!((*(*({
411+
let _head: Ptr<Node> = (*head.borrow()).clone();
412+
let _idx: i32 = 4;
413+
Find_0(_head, _idx)
414+
})
415+
.upgrade()
416+
.deref())
417+
.next
418+
.borrow())
419+
.is_null());
420+
assert!(
421+
((*(*(*(*(*(*({
422+
let _tail: Ptr<Node> = (*tail.borrow()).clone();
423+
let _idx: i32 = 1;
424+
FindBack_1(_tail, _idx)
425+
})
426+
.upgrade()
427+
.deref())
428+
.prev
429+
.borrow())
430+
.upgrade()
431+
.deref())
432+
.prev
433+
.borrow())
434+
.upgrade()
435+
.deref())
436+
.val
437+
.borrow())
438+
== 3)
439+
);
440+
(*(*(*(*({
441+
let _head: Ptr<Node> = (*head.borrow()).clone();
442+
let _idx: i32 = 0;
443+
Find_0(_head, _idx)
444+
})
445+
.upgrade()
446+
.deref())
447+
.next
448+
.borrow())
449+
.upgrade()
450+
.deref())
451+
.val
452+
.borrow_mut()) = 30;
453+
assert!(
454+
((*(*({
455+
let _head: Ptr<Node> = (*head.borrow()).clone();
456+
let _idx: i32 = 1;
457+
Find_0(_head, _idx)
458+
})
459+
.upgrade()
460+
.deref())
461+
.val
462+
.borrow())
463+
== 30)
464+
);
465+
let __rhs = ((*(*({
466+
let _head: Ptr<Node> = (*head.borrow()).clone();
467+
let _idx: i32 = 0;
468+
Find_0(_head, _idx)
469+
})
470+
.upgrade()
471+
.deref())
472+
.val
473+
.borrow())
474+
+ (*(*({
475+
let _head: Ptr<Node> = (*head.borrow()).clone();
476+
let _idx: i32 = 3;
477+
Find_0(_head, _idx)
478+
})
479+
.upgrade()
480+
.deref())
481+
.val
482+
.borrow()));
483+
(*(*(*(*({
484+
let _head: Ptr<Node> = (*head.borrow()).clone();
485+
let _idx: i32 = 1;
486+
Find_0(_head, _idx)
487+
})
488+
.upgrade()
489+
.deref())
490+
.next
491+
.borrow())
492+
.upgrade()
493+
.deref())
494+
.val
495+
.borrow_mut()) = __rhs;
496+
assert!(
497+
((*(*({
498+
let _head: Ptr<Node> = (*head.borrow()).clone();
499+
let _idx: i32 = 2;
500+
Find_0(_head, _idx)
501+
})
502+
.upgrade()
503+
.deref())
504+
.val
505+
.borrow())
506+
== (4 + 1))
507+
);
508+
let sum: Value<i32> = Rc::new(RefCell::new(
509+
(((((*(*({
510+
let _head: Ptr<Node> = (*head.borrow()).clone();
511+
let _idx: i32 = 0;
512+
Find_0(_head, _idx)
513+
})
514+
.upgrade()
515+
.deref())
516+
.val
517+
.borrow())
518+
+ (*(*({
519+
let _head: Ptr<Node> = (*head.borrow()).clone();
520+
let _idx: i32 = 1;
521+
Find_0(_head, _idx)
522+
})
523+
.upgrade()
524+
.deref())
525+
.val
526+
.borrow()))
527+
+ (*(*({
528+
let _head: Ptr<Node> = (*head.borrow()).clone();
529+
let _idx: i32 = 2;
530+
Find_0(_head, _idx)
531+
})
532+
.upgrade()
533+
.deref())
534+
.val
535+
.borrow()))
536+
+ (*(*({
537+
let _head: Ptr<Node> = (*head.borrow()).clone();
538+
let _idx: i32 = 3;
539+
Find_0(_head, _idx)
540+
})
541+
.upgrade()
542+
.deref())
543+
.val
544+
.borrow()))
545+
+ (*(*({
546+
let _head: Ptr<Node> = (*head.borrow()).clone();
547+
let _idx: i32 = 4;
548+
Find_0(_head, _idx)
549+
})
550+
.upgrade()
551+
.deref())
552+
.val
553+
.borrow())),
554+
));
555+
assert!(((*sum.borrow()) == ((((4 + 30) + 5) + 1) + -1_i32)));
556+
assert!(
557+
({
558+
let _lhs = (*(*({
559+
let _head: Ptr<Node> = (*head.borrow()).clone();
560+
let _idx: i32 = 0;
561+
Find_0(_head, _idx)
562+
})
563+
.upgrade()
564+
.deref())
565+
.val
566+
.borrow());
567+
_lhs + (*(*({
568+
let _tail: Ptr<Node> = (*tail.borrow()).clone();
569+
let _idx: i32 = 0;
570+
FindBack_1(_tail, _idx)
571+
})
572+
.upgrade()
573+
.deref())
574+
.val
575+
.borrow())
576+
} == (4 + -1_i32))
577+
);
578+
assert!({
579+
let _lhs = (*(*(*(*({
580+
let _head: Ptr<Node> = (*head.borrow()).clone();
581+
let _idx: i32 = 2;
582+
Find_0(_head, _idx)
583+
})
584+
.upgrade()
585+
.deref())
586+
.next
587+
.borrow())
588+
.upgrade()
589+
.deref())
590+
.val
591+
.borrow());
592+
_lhs == (*(*({
593+
let _tail: Ptr<Node> = (*tail.borrow()).clone();
594+
let _idx: i32 = 1;
595+
FindBack_1(_tail, _idx)
596+
})
597+
.upgrade()
598+
.deref())
599+
.val
600+
.borrow())
601+
});
602+
assert!({
603+
let _lhs = (*(*({
604+
let _head: Ptr<Node> = (*head.borrow()).clone();
605+
let _idx: i32 = 0;
606+
Find_0(_head, _idx)
607+
})
608+
.upgrade()
609+
.deref())
610+
.prev
611+
.borrow())
612+
.clone();
613+
_lhs == (*(*({
614+
let _tail: Ptr<Node> = (*tail.borrow()).clone();
615+
let _idx: i32 = 4;
616+
FindBack_1(_tail, _idx)
617+
})
618+
.upgrade()
619+
.deref())
620+
.prev
621+
.borrow())
622+
.clone()
623+
});
358624
return 0;
359625
}

0 commit comments

Comments
 (0)