about summary refs log tree commit diff
path: root/tests/ui/ergonomic-clones/closure/multiple-use-variants.rs
blob: e2e9820a740f224c6bdc98056ceef81c2436f0ac (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
#![feature(ergonomic_clones)]
#![allow(incomplete_features)]

use std::clone::UseCloned;

fn takes_val<T>(_: T) {}
fn takes_ref<'a, T>(_: &'a T) {}

#[derive(Clone)]
struct Inner<'a, T>(&'a T);

impl<'a, T> UseCloned for Inner<'a, T> where T: Clone {}

fn main() {
    let v = String::new();
    let inner = Inner(&v);

    let _ = use || {
        takes_ref(inner.0);
        takes_val(inner.0)
    };
    let _ = use || {
        takes_ref(inner.0);
        takes_val(inner.0);
        takes_val(inner.0);
        takes_val(inner)
    };
    let _ = use || {
        takes_ref(inner.0);
        takes_val(inner.0);
        takes_val(inner);
        takes_val(inner)
        //~^ ERROR: use of moved value: `inner` [E0382]
    };
}