;; Test type definitions

(module
  (type (func))
  (type $t (func))

  (type (func (param i32)))
  (type (func (param $x i32)))
  (type (func (result i32)))
  (type (func (param i32) (result i32)))
  (type (func (param $x i32) (result i32)))

  (type (func (param f32 f64)))
  ;; (type (func (result i64 f32)))
  ;; (type (func (param i32 i64) (result f32 f64)))

  (type (func (param f32) (param f64)))
  (type (func (param $x f32) (param f64)))
  (type (func (param f32) (param $y f64)))
  (type (func (param $x f32) (param $y f64)))
  ;; (type (func (result i64) (result f32)))
  ;; (type (func (param i32) (param i64) (result f32) (result f64)))
  ;; (type (func (param $x i32) (param $y i64) (result f32) (result f64)))

  (type (func (param f32 f64) (param $x i32) (param f64 i32 i32)))
  ;; (type (func (result i64 i64 f32) (result f32 i32)))
  ;; (type
  ;;   (func (param i32 i32) (param i64 i32) (result f32 f64) (result f64 i32))
  ;; )

  (type (func (param) (param $x f32) (param) (param) (param f64 i32) (param)))
  ;; (type
  ;;   (func (result) (result) (result i64 i64) (result) (result f32) (result))
  ;; )
  ;; (type
  ;;   (func
  ;;     (param i32 i32) (param i64 i32) (param) (param $x i32) (param)
  ;;     (result) (result f32 f64) (result f64 i32) (result)
  ;;   )
  ;; )
)

(assert_malformed
  (module quote "(type (func (result i32) (param i32)))")
  "result before parameter"
)
(assert_malformed
  (module quote "(type (func (result $x i32)))")
  "unexpected token"
)

(assert_invalid
  (module (type (func (result i32 i32))))
  "invalid result arity"
)
(assert_invalid
  (module (type (func (result i32) (result i32))))
  "invalid result arity"
)
