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

;; Test that trivial exact casts are ok even when custom descriptors is
;; disabled.

;; RUN: wasm-opt %s -all --disable-custom-descriptors -S -o - | filecheck %s

(module
  ;; CHECK:      (type $foo (struct))
  (type $foo (struct))

  ;; CHECK:      (func $ref.cast (type $1) (param $0 (ref (exact $foo))) (param $1 (ref null (exact $foo)))
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.cast (ref (exact $foo))
  ;; CHECK-NEXT:    (local.get $0)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.cast (ref (exact $foo))
  ;; CHECK-NEXT:    (local.get $0)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.cast (ref null (exact $foo))
  ;; CHECK-NEXT:    (local.get $1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.cast (ref (exact $foo))
  ;; CHECK-NEXT:    (local.get $1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $ref.cast (param (ref (exact $foo)) (ref null (exact $foo)))
    (drop
      (ref.cast anyref
        (local.get 0)
      )
    )
    (drop
      (ref.cast (ref any)
        (local.get 0)
      )
    )
    (drop
      (ref.cast anyref
        (local.get 1)
      )
    )
    (drop
      (ref.cast (ref any)
        (local.get 1)
      )
    )
  )

  ;; CHECK:      (func $ref.test (type $1) (param $0 (ref (exact $foo))) (param $1 (ref null (exact $foo)))
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.test (ref (exact $foo))
  ;; CHECK-NEXT:    (local.get $0)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.test (ref (exact $foo))
  ;; CHECK-NEXT:    (local.get $0)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.test (ref null (exact $foo))
  ;; CHECK-NEXT:    (local.get $1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (ref.test (ref (exact $foo))
  ;; CHECK-NEXT:    (local.get $1)
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $ref.test (param (ref (exact $foo)) (ref null (exact $foo)))
    (drop
      (ref.test anyref
        (local.get 0)
      )
    )
    (drop
      (ref.test (ref any)
        (local.get 0)
      )
    )
    (drop
      (ref.test anyref
        (local.get 1)
      )
    )
    (drop
      (ref.test (ref any)
        (local.get 1)
      )
    )
  )

  ;; CHECK:      (func $br_on_cast (type $2) (param $0 (ref null (exact $foo))) (param $1 (ref null (exact $foo)))
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block (result anyref)
  ;; CHECK-NEXT:    (br_on_cast $block (ref null (exact $foo)) (ref null (exact $foo))
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block1 (result anyref)
  ;; CHECK-NEXT:    (br_on_cast $block1 (ref null (exact $foo)) (ref (exact $foo))
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block2 (result anyref)
  ;; CHECK-NEXT:    (br_on_cast $block2 (ref null (exact $foo)) (ref null (exact $foo))
  ;; CHECK-NEXT:     (local.get $1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block3 (result anyref)
  ;; CHECK-NEXT:    (br_on_cast $block3 (ref null (exact $foo)) (ref (exact $foo))
  ;; CHECK-NEXT:     (local.get $1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $br_on_cast (param (ref null (exact $foo)) (ref null (exact $foo)))
    (drop
      (block (result anyref)
        (br_on_cast 0 anyref anyref
          (local.get 0)
        )
      )
    )
    (drop
      (block (result anyref)
        (br_on_cast 0 anyref (ref any)
          (local.get 0)
        )
      )
    )
    (drop
      (block (result anyref)
        (br_on_cast 0 anyref anyref
          (local.get 1)
        )
      )
    )
    (drop
      (block (result anyref)
        (br_on_cast 0 anyref (ref any)
          (local.get 1)
        )
      )
    )
  )

  ;; CHECK:      (func $br_on_cast_fail (type $1) (param $0 (ref (exact $foo))) (param $1 (ref null (exact $foo)))
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block (result anyref)
  ;; CHECK-NEXT:    (br_on_cast_fail $block (ref (exact $foo)) (ref (exact $foo))
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block1 (result anyref)
  ;; CHECK-NEXT:    (br_on_cast_fail $block1 (ref (exact $foo)) (ref (exact $foo))
  ;; CHECK-NEXT:     (local.get $0)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block2 (result anyref)
  ;; CHECK-NEXT:    (br_on_cast_fail $block2 (ref null (exact $foo)) (ref null (exact $foo))
  ;; CHECK-NEXT:     (local.get $1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT:  (drop
  ;; CHECK-NEXT:   (block $block3 (result anyref)
  ;; CHECK-NEXT:    (br_on_cast_fail $block3 (ref null (exact $foo)) (ref (exact $foo))
  ;; CHECK-NEXT:     (local.get $1)
  ;; CHECK-NEXT:    )
  ;; CHECK-NEXT:   )
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  (func $br_on_cast_fail (param (ref (exact $foo)) (ref null (exact $foo)))
    (drop
      (block (result anyref)
        (br_on_cast_fail 0 anyref anyref
          (local.get 0)
        )
      )
    )
    (drop
      (block (result anyref)
        (br_on_cast_fail 0 anyref (ref any)
          (local.get 0)
        )
      )
    )
    (drop
      (block (result anyref)
        (br_on_cast_fail 0 anyref anyref
          (local.get 1)
        )
      )
    )
    (drop
      (block (result anyref)
        (br_on_cast_fail 0 anyref (ref any)
          (local.get 1)
        )
      )
    )
  )
)
