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

;; RUN: wasm-opt %s -all -o %t.text.wast -g -S
;; RUN: wasm-as %s -all -g -o %t.wasm
;; RUN: wasm-dis %t.wasm -all -o %t.bin.wast
;; RUN: wasm-as %s -all -o %t.nodebug.wasm
;; RUN: wasm-dis %t.nodebug.wasm -all -o %t.bin.nodebug.wast
;; RUN: cat %t.text.wast | filecheck %s --check-prefix=CHECK-TEXT
;; RUN: cat %t.bin.wast | filecheck %s --check-prefix=CHECK-BIN
;; RUN: cat %t.bin.nodebug.wast | filecheck %s --check-prefix=CHECK-BIN-NODEBUG

(module
 ;; CHECK-TEXT:      (type $ft (func (param i32) (result i32)))
 ;; CHECK-BIN:      (type $ft (func (param i32) (result i32)))
 (type $ft (func (param i32) (result i32)))
 ;; CHECK-TEXT:      (type $ct (cont $ft))
 ;; CHECK-BIN:      (type $ct (cont $ft))
 (type $ct (cont $ft))

 ;; CHECK-TEXT:      (type $2 (func (result (ref $ct))))

 ;; CHECK-TEXT:      (type $3 (func (result (ref cont))))

 ;; CHECK-TEXT:      (elem declare func $g)

 ;; CHECK-TEXT:      (func $f (type $2) (result (ref $ct))
 ;; CHECK-TEXT-NEXT:  (block ;; (replaces unreachable ContNew we can't emit)
 ;; CHECK-TEXT-NEXT:   (drop
 ;; CHECK-TEXT-NEXT:    (unreachable)
 ;; CHECK-TEXT-NEXT:   )
 ;; CHECK-TEXT-NEXT:   (unreachable)
 ;; CHECK-TEXT-NEXT:  )
 ;; CHECK-TEXT-NEXT: )
 ;; CHECK-BIN:      (type $2 (func (result (ref $ct))))

 ;; CHECK-BIN:      (type $3 (func (result (ref cont))))

 ;; CHECK-BIN:      (elem declare func $g)

 ;; CHECK-BIN:      (func $f (type $2) (result (ref $ct))
 ;; CHECK-BIN-NEXT:  (unreachable)
 ;; CHECK-BIN-NEXT: )
 (func $f (result (ref $ct))
   (cont.new $ct (unreachable)))

 ;; CHECK-TEXT:      (func $g (type $ft) (param $0 i32) (result i32)
 ;; CHECK-TEXT-NEXT:  (i32.const 123)
 ;; CHECK-TEXT-NEXT: )
 ;; CHECK-BIN:      (func $g (type $ft) (param $0 i32) (result i32)
 ;; CHECK-BIN-NEXT:  (i32.const 123)
 ;; CHECK-BIN-NEXT: )
 (func $g (param i32) (result i32)
   (i32.const 123)
 )
 ;; CHECK-BIN-NODEBUG:      (type $0 (func (param i32) (result i32)))

 ;; CHECK-BIN-NODEBUG:      (type $1 (cont $0))

 ;; CHECK-BIN-NODEBUG:      (type $2 (func (result (ref $1))))

 ;; CHECK-BIN-NODEBUG:      (type $3 (func (result (ref cont))))

 ;; CHECK-BIN-NODEBUG:      (elem declare func $1)
 (elem declare func $g)

 ;; CHECK-TEXT:      (func $h (type $2) (result (ref $ct))
 ;; CHECK-TEXT-NEXT:  (cont.new $ct
 ;; CHECK-TEXT-NEXT:   (ref.func $g)
 ;; CHECK-TEXT-NEXT:  )
 ;; CHECK-TEXT-NEXT: )
 ;; CHECK-BIN:      (func $h (type $2) (result (ref $ct))
 ;; CHECK-BIN-NEXT:  (cont.new $ct
 ;; CHECK-BIN-NEXT:   (ref.func $g)
 ;; CHECK-BIN-NEXT:  )
 ;; CHECK-BIN-NEXT: )
 (func $h (result (ref $ct))
   (cont.new $ct (ref.func $g))
 )

 ;; CHECK-TEXT:      (func $k (type $3) (result (ref cont))
 ;; CHECK-TEXT-NEXT:  (cont.new $ct
 ;; CHECK-TEXT-NEXT:   (ref.null nofunc)
 ;; CHECK-TEXT-NEXT:  )
 ;; CHECK-TEXT-NEXT: )
 ;; CHECK-BIN:      (func $k (type $3) (result (ref cont))
 ;; CHECK-BIN-NEXT:  (cont.new $ct
 ;; CHECK-BIN-NEXT:   (ref.null nofunc)
 ;; CHECK-BIN-NEXT:  )
 ;; CHECK-BIN-NEXT: )
 (func $k (result (ref cont))
   (cont.new $ct (ref.null nofunc)))

)
;; CHECK-BIN-NODEBUG:      (func $0 (type $2) (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT:  (unreachable)
;; CHECK-BIN-NODEBUG-NEXT: )

;; CHECK-BIN-NODEBUG:      (func $1 (type $0) (param $0 i32) (result i32)
;; CHECK-BIN-NODEBUG-NEXT:  (i32.const 123)
;; CHECK-BIN-NODEBUG-NEXT: )

;; CHECK-BIN-NODEBUG:      (func $2 (type $2) (result (ref $1))
;; CHECK-BIN-NODEBUG-NEXT:  (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT:   (ref.func $1)
;; CHECK-BIN-NODEBUG-NEXT:  )
;; CHECK-BIN-NODEBUG-NEXT: )

;; CHECK-BIN-NODEBUG:      (func $3 (type $3) (result (ref cont))
;; CHECK-BIN-NODEBUG-NEXT:  (cont.new $1
;; CHECK-BIN-NODEBUG-NEXT:   (ref.null nofunc)
;; CHECK-BIN-NODEBUG-NEXT:  )
;; CHECK-BIN-NODEBUG-NEXT: )
