summaryrefslogtreecommitdiffstats
path: root/src/test/ui/intrinsics/const-eval-select-bad.rs
blob: fa14efad7b4a473ebd2f8744a2d9b7b154f2a7ce (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
44
45
46
#![feature(const_eval_select)]
#![feature(core_intrinsics)]

use std::intrinsics::const_eval_select;

const fn not_fn_items() {
    const_eval_select((), || {}, || {});
    //~^ ERROR this argument must be a function item
    //~| ERROR this argument must be a function item
    const_eval_select((), 42, 0xDEADBEEF);
    //~^ ERROR expected a `FnOnce<()>` closure
    //~| ERROR expected a `FnOnce<()>` closure
    //~| ERROR this argument must be a function item
    //~| ERROR this argument must be a function item
}

const fn foo(n: i32) -> i32 {
    n
}

fn bar(n: i32) -> bool {
    assert_eq!(n, 0, "{} must be equal to {}", n, 0);
    n == 0
}

fn baz(n: bool) -> i32 {
    assert!(n, "{} must be true", n);
    n as i32
}

const fn return_ty_mismatch() {
    const_eval_select((1,), foo, bar);
    //~^ ERROR expected `fn(i32) -> bool {bar}` to be a fn item that returns `i32`, but it returns `bool`
}

const fn args_ty_mismatch() {
    const_eval_select((true,), foo, baz);
    //~^ ERROR type mismatch
}

const fn non_const_fn() {
    const_eval_select((1,), bar, bar);
    //~^ ERROR this argument must be a `const fn`
}

fn main() {}