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

;; RUN: wasm-opt %s --remove-unused-names --precompute-propagate --fuzz-exec -all -S -o - \
;; RUN:   | filecheck %s

(module
  (rec
    ;; CHECK:      (rec
    ;; CHECK-NEXT:  (type $struct (descriptor $desc) (struct))
    (type $struct (descriptor $desc) (struct))
    ;; CHECK:       (type $desc (describes $struct) (struct))
    (type $desc (describes $struct) (struct))
  )

  ;; CHECK:      (global $desc (ref (exact $desc)) (struct.new_default $desc))
  (global $desc (ref (exact $desc)) (struct.new $desc))
  ;; CHECK:      (global $struct (ref $struct) (struct.new_default_desc $struct
  ;; CHECK-NEXT:  (global.get $desc)
  ;; CHECK-NEXT: ))
  (global $struct (ref $struct) (struct.new_desc $struct (global.get $desc)))

  ;; CHECK:      (func $eq-descs (type $0) (result i32)
  ;; CHECK-NEXT:  (i32.const 1)
  ;; CHECK-NEXT: )
  (func $eq-descs (result i32)
    (ref.eq
      (ref.get_desc $struct
        (struct.new_desc $struct
          (global.get $desc)
        )
      )
      (global.get $desc)
    )
  )

  ;; CHECK:      (func $different-descs (type $0) (result i32)
  ;; CHECK-NEXT:  (i32.const 0)
  ;; CHECK-NEXT: )
  (func $different-descs (result i32)
    (ref.eq
      (ref.get_desc $struct
        (struct.new_desc $struct
          (struct.new $desc)
        )
      )
      (global.get $desc)
    )
  )

  ;; CHECK:      (func $br-on-cast-desc-eq (type $0) (result i32)
  ;; CHECK-NEXT:  (i32.const 1)
  ;; CHECK-NEXT: )
  (func $br-on-cast-desc-eq (result i32)
    (ref.eq
      (block $l (result eqref)
        (drop
          (br_on_cast_desc_eq $l eqref (ref $struct)
            (global.get $struct)
            (global.get $desc)
          )
        )
        (ref.null none)
      )
      (global.get $struct)
    )
  )

  ;; CHECK:      (func $br-on-cast-desc-eq-fail (type $0) (result i32)
  ;; CHECK-NEXT:  (i32.const 0)
  ;; CHECK-NEXT: )
  (func $br-on-cast-desc-eq-fail (result i32)
    (ref.eq
      (block $l (result eqref)
        (drop
          (br_on_cast_desc_eq_fail $l eqref (ref $struct)
            (global.get $struct)
            (global.get $desc)
          )
        )
        (ref.null none)
      )
      (global.get $struct)
    )
  )
)
