summaryrefslogtreecommitdiffstats
path: root/tests/ui/consts/promotion.rs
blob: e379e3aea13d4f4ea657781c91bd483e4a6f95c8 (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
// revisions: noopt opt opt_with_overflow_checks
//[noopt]compile-flags: -C opt-level=0
//[opt]compile-flags: -O
//[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O

// build-pass

const fn assert_static<T>(_: &'static T) {}

#[allow(unconditional_panic)]
const fn fail() -> i32 {
    1/0
}
const C: i32 = {
    // Promoted that fails to evaluate in dead code -- this must work
    // (for backwards compatibility reasons).
    if false {
        assert_static(&fail());
    }
    42
};

fn main() {
    assert_static(&["a", "b", "c"]);
    assert_static(&["d", "e", "f"]);
    assert_eq!(C, 42);

    // make sure that these do not cause trouble despite overflowing
    assert_static(&(0-1));
    assert_static(&-i32::MIN);

    // div-by-non-0 is okay
    assert_static(&(1/1));
    assert_static(&(1%1));

    // in-bounds array access is okay
    assert_static(&([1,2,3][0] + 1));
    assert_static(&[[1,2][1]]);

    // Top-level projections are not part of the promoted, so no error here.
    if false {
        #[allow(unconditional_panic)]
        assert_static(&[1,2,3][4]);
    }
}