Removing last will break my library.

#[macro_export]
macro_rules! list {
    () => {
	None
    };
    [ $x:expr, $( $y:expr ),* ] => {
	{
	    let mut first = cons($x, &None);
	    let mut last = &mut first;
	    $(
		let yet_another = cons($y, &None);
		if let Some(ref mut last_inner) = last {
		    let last_mut = Rc::get_mut(last_inner).unwrap();
		    last_mut.cdr = yet_another;
		    last = &mut last_mut.cdr;
		}
	    )*
	    first
	}
    }
}

This macro works as I expected because it can pass these tests.

    #[test]
    fn dolist() {
        let mut v = vec![];
        dolist!((i &cons(10, &list![20, 30, 40])) {
            v.push(i.car);
        });
        assert_eq!(v, vec![10, 20, 30, 40]);
    }

    #[test]
    fn turn_list_to_vec() {
        assert_eq!(list_to_vec(&list![1, 2, 3]), vec![1, 2, 3]);
    }

    #[test]
    fn count_elements() {
        assert_eq!(list_len(&list![10, 20, 30]), 3);
    }

However I got the warning “value assigned to last is never read.”

How can I avoid this warning?

P.S. Full code

  • veer66OP
    link
    fedilink
    English
    arrow-up
    2
    ·
    10 months ago

    Clippy didn’t tell anything about the macro.

    warning: dereferencing a tuple pattern where every element takes a reference
      --> src/lib.rs:13:9
       |
    13 |         &Some(ref cons_rc) => {
       |         ^^^^^^^^^^^^^^^^^^
       |
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrowed_reference
       = note: `#[warn(clippy::needless_borrowed_reference)]` on by default
    help: try removing the `&` and `ref` parts
       |
    13 -         &Some(ref cons_rc) => {
    13 +         Some(cons_rc) => {
       |
    

    To put #[allow(this_linting_rule)] like this:

        [ $x:expr, $( $y:expr ),* ] => {
    	#[allow(unused_assignments)]
    	{
    

    I got error[E0658]: attributes on expressions are experimental.

    To put it like this:

    #[macro_export]
    #[allow(unused_assignments)]
    macro_rules! list {
        () => {
    	None
    

    It doesn’t work.