;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.

;; RUN: foreach %s %t wasm-opt --inlining      -S -o - | filecheck %s
;; RUN: foreach %s %t wasm-opt --inlining -tnh -S -o - | filecheck %s

;; Check that with or without TrapsNeverHappen, we inline calls to trapping
;; functions. That propagates the unreachability for other passes.

(module
  ;; CHECK:      (type $0 (func))

  ;; CHECK:      (func $call-trap
  ;; CHECK-NEXT:  (if
  ;; CHECK-NEXT:   (i32.const 42)
  ;; CHECK-NEXT:   (then
  ;; CHECK-NEXT:    (block $__inlined_func$trap
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:   (else
  ;; CHECK-NEXT:    (block $__inlined_func$trap$1
  ;; CHECK-NEXT:     (unreachable)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $call-trap
    ;; Call twice to avoid the single-caller rules, which always inline.
    (if
      (i32.const 42)
      (then
        (call $trap)
      )
      (else
        (call $trap)
      )
    )
  )

  (func $trap
    (unreachable)
  )

  ;; CHECK:      (func $call-trap-value
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (if
  ;; CHECK-NEXT:    (i32.const 42)
  ;; CHECK-NEXT:    (then
  ;; CHECK-NEXT:     (block $__inlined_func$trap-value$2
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:    (else
  ;; CHECK-NEXT:     (block $__inlined_func$trap-value$3
  ;; CHECK-NEXT:      (unreachable)
  ;; CHECK-NEXT:     )
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $call-trap-value
    (drop
      (if (result i32)
        (i32.const 42)
        (then
          (call $trap-value)
        )
        (else
          (call $trap-value)
        )
      )
    )
  )

  (func $trap-value (result i32)
    (unreachable)
  )
)
