summary refs log tree commit diff
path: root/src/test/compile-fail/pure-subtyping.rs
blob: 6725bd19e440f818993f931689166f5c813cc5bb (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
// Test rules governing higher-order pure fns.

fn assign_to_pure(x: pure fn(), y: fn(), z: unsafe fn()) {
    let a: pure fn() = x;
    let b: pure fn() = y; //~ ERROR expected pure fn but found impure fn
    let c: pure fn() = z; //~ ERROR expected pure fn but found unsafe fn
}

fn assign_to_impure(x: pure fn(), y: fn(), z: unsafe fn()) {
    let h: fn() = x;
    let i: fn() = y;
    let j: fn() = z; //~ ERROR expected impure fn but found unsafe fn
}

fn assign_to_unsafe(x: pure fn(), y: fn(), z: unsafe fn()) {
    let m: unsafe fn() = x;
    let n: unsafe fn() = y;
    let o: unsafe fn() = z;
}

fn assign_to_pure2(x: pure fn@(), y: fn@(), z: unsafe fn@()) {
    let a: pure fn() = x;
    let b: pure fn() = y; //~ ERROR expected pure fn but found impure fn
    let c: pure fn() = z; //~ ERROR expected pure fn but found unsafe fn

    let a: pure fn~() = x; //~ ERROR closure protocol mismatch (fn~ vs fn@)
    let b: pure fn~() = y; //~ ERROR closure protocol mismatch (fn~ vs fn@)
    let c: pure fn~() = z; //~ ERROR closure protocol mismatch (fn~ vs fn@)

    let a: unsafe fn~() = x; //~ ERROR closure protocol mismatch (fn~ vs fn@)
    let b: unsafe fn~() = y; //~ ERROR closure protocol mismatch (fn~ vs fn@)
    let c: unsafe fn~() = z; //~ ERROR closure protocol mismatch (fn~ vs fn@)
}

fn main() {
}