]> git.proxmox.com Git - rustc.git/blob - src/binaryen/test/spec/traps.wast
New upstream version 1.23.0+dfsg1
[rustc.git] / src / binaryen / test / spec / traps.wast
1 ;; Test that traps are preserved even in instructions which might otherwise
2 ;; be dead-code-eliminated. These functions all perform an operation and
3 ;; discard its return value.
4
5 (module
6 (func (export "no_dce.i32.div_s") (param $x i32) (param $y i32) (result i32)
7 (i32.div_s (get_local $x) (get_local $y)))
8 (func (export "no_dce.i32.div_u") (param $x i32) (param $y i32) (result i32)
9 (i32.div_u (get_local $x) (get_local $y)))
10 (func (export "no_dce.i64.div_s") (param $x i64) (param $y i64) (result i64)
11 (i64.div_s (get_local $x) (get_local $y)))
12 (func (export "no_dce.i64.div_u") (param $x i64) (param $y i64) (result i64)
13 (i64.div_u (get_local $x) (get_local $y)))
14 )
15
16 (assert_trap (invoke "no_dce.i32.div_s" (i32.const 1) (i32.const 0)) "integer divide by zero")
17 (assert_trap (invoke "no_dce.i32.div_u" (i32.const 1) (i32.const 0)) "integer divide by zero")
18 (assert_trap (invoke "no_dce.i64.div_s" (i64.const 1) (i64.const 0)) "integer divide by zero")
19 (assert_trap (invoke "no_dce.i64.div_u" (i64.const 1) (i64.const 0)) "integer divide by zero")
20
21 (module
22 (func (export "no_dce.i32.rem_s") (param $x i32) (param $y i32) (result i32)
23 (i32.rem_s (get_local $x) (get_local $y)))
24 (func (export "no_dce.i32.rem_u") (param $x i32) (param $y i32) (result i32)
25 (i32.rem_u (get_local $x) (get_local $y)))
26 (func (export "no_dce.i64.rem_s") (param $x i64) (param $y i64) (result i64)
27 (i64.rem_s (get_local $x) (get_local $y)))
28 (func (export "no_dce.i64.rem_u") (param $x i64) (param $y i64) (result i64)
29 (i64.rem_u (get_local $x) (get_local $y)))
30 )
31
32 (assert_trap (invoke "no_dce.i32.rem_s" (i32.const 1) (i32.const 0)) "integer divide by zero")
33 (assert_trap (invoke "no_dce.i32.rem_u" (i32.const 1) (i32.const 0)) "integer divide by zero")
34 (assert_trap (invoke "no_dce.i64.rem_s" (i64.const 1) (i64.const 0)) "integer divide by zero")
35 (assert_trap (invoke "no_dce.i64.rem_u" (i64.const 1) (i64.const 0)) "integer divide by zero")
36
37 (module
38 (func (export "no_dce.i32.trunc_s_f32") (param $x f32) (result i32) (i32.trunc_s/f32 (get_local $x)))
39 (func (export "no_dce.i32.trunc_u_f32") (param $x f32) (result i32) (i32.trunc_u/f32 (get_local $x)))
40 (func (export "no_dce.i32.trunc_s_f64") (param $x f64) (result i32) (i32.trunc_s/f64 (get_local $x)))
41 (func (export "no_dce.i32.trunc_u_f64") (param $x f64) (result i32) (i32.trunc_u/f64 (get_local $x)))
42 (func (export "no_dce.i64.trunc_s_f32") (param $x f32) (result i64) (i64.trunc_s/f32 (get_local $x)))
43 (func (export "no_dce.i64.trunc_u_f32") (param $x f32) (result i64) (i64.trunc_u/f32 (get_local $x)))
44 (func (export "no_dce.i64.trunc_s_f64") (param $x f64) (result i64) (i64.trunc_s/f64 (get_local $x)))
45 (func (export "no_dce.i64.trunc_u_f64") (param $x f64) (result i64) (i64.trunc_u/f64 (get_local $x)))
46 )
47
48 (assert_trap (invoke "no_dce.i32.trunc_s_f32" (f32.const nan)) "invalid conversion to integer")
49 (assert_trap (invoke "no_dce.i32.trunc_u_f32" (f32.const nan)) "invalid conversion to integer")
50 (assert_trap (invoke "no_dce.i32.trunc_s_f64" (f64.const nan)) "invalid conversion to integer")
51 (assert_trap (invoke "no_dce.i32.trunc_u_f64" (f64.const nan)) "invalid conversion to integer")
52 (assert_trap (invoke "no_dce.i64.trunc_s_f32" (f32.const nan)) "invalid conversion to integer")
53 (assert_trap (invoke "no_dce.i64.trunc_u_f32" (f32.const nan)) "invalid conversion to integer")
54 (assert_trap (invoke "no_dce.i64.trunc_s_f64" (f64.const nan)) "invalid conversion to integer")
55 (assert_trap (invoke "no_dce.i64.trunc_u_f64" (f64.const nan)) "invalid conversion to integer")
56
57 (module
58 (memory 1)
59
60 (func (export "no_dce.i32.load") (param $i i32) (result i32) (i32.load (get_local $i)))
61 (func (export "no_dce.i64.load") (param $i i32) (result i64) (i64.load (get_local $i)))
62 (func (export "no_dce.f32.load") (param $i i32) (result f32) (f32.load (get_local $i)))
63 (func (export "no_dce.f64.load") (param $i i32) (result f64) (f64.load (get_local $i)))
64 )
65
66 (assert_trap (invoke "no_dce.i32.load" (i32.const 65536)) "out of bounds memory access")
67 (assert_trap (invoke "no_dce.i64.load" (i32.const 65536)) "out of bounds memory access")
68 (assert_trap (invoke "no_dce.f32.load" (i32.const 65536)) "out of bounds memory access")
69 (assert_trap (invoke "no_dce.f64.load" (i32.const 65536)) "out of bounds memory access")