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

;; Check that string.as_wtf16 is accepted by the parser but is not translated
;; into any IR.

;; RUN: wasm-opt %s -all -S -o - | filecheck %s
;; RUN: wasm-opt %s -all --shrink-level=3 --roundtrip -S -o - | filecheck %s --check-prefix=RTRIP
;; RUN: wasm-opt %s -all --shrink-level=3 --roundtrip --roundtrip -S -o - | filecheck %s --check-prefix=RRTRP

(module
  ;; CHECK:      (func $empty (type $2)
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $empty (type $2)
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $empty (type $2)
  ;; RRTRP-NEXT: )
  (func $empty
    (string.as_wtf16)
  )

  ;; CHECK:      (func $codeunit (type $1) (result i32)
  ;; CHECK-NEXT:  (stringview_wtf16.get_codeunit
  ;; CHECK-NEXT:   (string.const "abc")
  ;; CHECK-NEXT:   (i32.const 0)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $codeunit (type $1) (result i32)
  ;; RTRIP-NEXT:  (local $0 i32)
  ;; RTRIP-NEXT:  (local $scratch (ref string))
  ;; RTRIP-NEXT:  (stringview_wtf16.get_codeunit
  ;; RTRIP-NEXT:   (block (result (ref string))
  ;; RTRIP-NEXT:    (local.set $scratch
  ;; RTRIP-NEXT:     (string.const "abc")
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.set $0
  ;; RTRIP-NEXT:     (i32.const 0)
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.get $scratch)
  ;; RTRIP-NEXT:   )
  ;; RTRIP-NEXT:   (local.get $0)
  ;; RTRIP-NEXT:  )
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $codeunit (type $1) (result i32)
  ;; RRTRP-NEXT:  (local $0 i32)
  ;; RRTRP-NEXT:  (local $scratch (ref string))
  ;; RRTRP-NEXT:  (local $scratch_2 (ref string))
  ;; RRTRP-NEXT:  (stringview_wtf16.get_codeunit
  ;; RRTRP-NEXT:   (block (result (ref string))
  ;; RRTRP-NEXT:    (local.set $scratch_2
  ;; RRTRP-NEXT:     (string.const "abc")
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.set $0
  ;; RRTRP-NEXT:     (i32.const 0)
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.get $scratch_2)
  ;; RRTRP-NEXT:   )
  ;; RRTRP-NEXT:   (local.get $0)
  ;; RRTRP-NEXT:  )
  ;; RRTRP-NEXT: )
  (func $codeunit (result i32)
    ;; This should parse ok with the conversion skipped. The roundtrip will
    ;; include scratch locals.
    (stringview_wtf16.get_codeunit
      (string.as_wtf16
        (string.const "abc")
      )
      (i32.const 0)
    )
  )

  ;; CHECK:      (func $codeunit-get (type $1) (result i32)
  ;; CHECK-NEXT:  (local $pos i32)
  ;; CHECK-NEXT:  (stringview_wtf16.get_codeunit
  ;; CHECK-NEXT:   (string.const "abc")
  ;; CHECK-NEXT:   (local.get $pos)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $codeunit-get (type $1) (result i32)
  ;; RTRIP-NEXT:  (local $pos i32)
  ;; RTRIP-NEXT:  (stringview_wtf16.get_codeunit
  ;; RTRIP-NEXT:   (string.const "abc")
  ;; RTRIP-NEXT:   (local.get $pos)
  ;; RTRIP-NEXT:  )
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $codeunit-get (type $1) (result i32)
  ;; RRTRP-NEXT:  (local $pos i32)
  ;; RRTRP-NEXT:  (stringview_wtf16.get_codeunit
  ;; RRTRP-NEXT:   (string.const "abc")
  ;; RRTRP-NEXT:   (local.get $pos)
  ;; RRTRP-NEXT:  )
  ;; RRTRP-NEXT: )
  (func $codeunit-get (result i32)
    (local $pos i32)
    ;; This will not use a scratch local for pos.
    (stringview_wtf16.get_codeunit
      (string.const "abc")
      (local.get $pos)
    )
  )

  ;; CHECK:      (func $slice (type $0) (result stringref)
  ;; CHECK-NEXT:  (stringview_wtf16.slice
  ;; CHECK-NEXT:   (string.const "abc")
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (i32.const 2)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $slice (type $0) (result stringref)
  ;; RTRIP-NEXT:  (local $0 i32)
  ;; RTRIP-NEXT:  (local $1 i32)
  ;; RTRIP-NEXT:  (local $scratch i32)
  ;; RTRIP-NEXT:  (local $scratch_3 (ref string))
  ;; RTRIP-NEXT:  (stringview_wtf16.slice
  ;; RTRIP-NEXT:   (block (result (ref string))
  ;; RTRIP-NEXT:    (local.set $scratch_3
  ;; RTRIP-NEXT:     (string.const "abc")
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.set $0
  ;; RTRIP-NEXT:     (block (result i32)
  ;; RTRIP-NEXT:      (local.set $scratch
  ;; RTRIP-NEXT:       (i32.const 1)
  ;; RTRIP-NEXT:      )
  ;; RTRIP-NEXT:      (local.set $1
  ;; RTRIP-NEXT:       (i32.const 2)
  ;; RTRIP-NEXT:      )
  ;; RTRIP-NEXT:      (local.get $scratch)
  ;; RTRIP-NEXT:     )
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.get $scratch_3)
  ;; RTRIP-NEXT:   )
  ;; RTRIP-NEXT:   (local.get $0)
  ;; RTRIP-NEXT:   (local.get $1)
  ;; RTRIP-NEXT:  )
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $slice (type $0) (result stringref)
  ;; RRTRP-NEXT:  (local $0 i32)
  ;; RRTRP-NEXT:  (local $1 i32)
  ;; RRTRP-NEXT:  (local $scratch i32)
  ;; RRTRP-NEXT:  (local $scratch_3 (ref string))
  ;; RRTRP-NEXT:  (local $scratch_4 i32)
  ;; RRTRP-NEXT:  (local $scratch_5 (ref string))
  ;; RRTRP-NEXT:  (stringview_wtf16.slice
  ;; RRTRP-NEXT:   (block (result (ref string))
  ;; RRTRP-NEXT:    (local.set $scratch_5
  ;; RRTRP-NEXT:     (string.const "abc")
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.set $0
  ;; RRTRP-NEXT:     (block (result i32)
  ;; RRTRP-NEXT:      (local.set $scratch_4
  ;; RRTRP-NEXT:       (i32.const 1)
  ;; RRTRP-NEXT:      )
  ;; RRTRP-NEXT:      (local.set $1
  ;; RRTRP-NEXT:       (i32.const 2)
  ;; RRTRP-NEXT:      )
  ;; RRTRP-NEXT:      (local.get $scratch_4)
  ;; RRTRP-NEXT:     )
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.get $scratch_5)
  ;; RRTRP-NEXT:   )
  ;; RRTRP-NEXT:   (local.get $0)
  ;; RRTRP-NEXT:   (local.get $1)
  ;; RRTRP-NEXT:  )
  ;; RRTRP-NEXT: )
  (func $slice (result stringref)
    ;; This should parse ok with the conversion skipped. The roundtrip will
    ;; include scratch locals.
    (stringview_wtf16.slice
      (string.as_wtf16
        (string.const "abc")
      )
      (i32.const 1)
      (i32.const 2)
    )
  )

  ;; CHECK:      (func $slice-start-get (type $0) (result stringref)
  ;; CHECK-NEXT:  (local $start i32)
  ;; CHECK-NEXT:  (stringview_wtf16.slice
  ;; CHECK-NEXT:   (string.const "abc")
  ;; CHECK-NEXT:   (local.get $start)
  ;; CHECK-NEXT:   (i32.const 2)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $slice-start-get (type $0) (result stringref)
  ;; RTRIP-NEXT:  (local $start i32)
  ;; RTRIP-NEXT:  (local $1 i32)
  ;; RTRIP-NEXT:  (local $2 i32)
  ;; RTRIP-NEXT:  (local $scratch i32)
  ;; RTRIP-NEXT:  (local $scratch_4 (ref string))
  ;; RTRIP-NEXT:  (stringview_wtf16.slice
  ;; RTRIP-NEXT:   (block (result (ref string))
  ;; RTRIP-NEXT:    (local.set $scratch_4
  ;; RTRIP-NEXT:     (string.const "abc")
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.set $1
  ;; RTRIP-NEXT:     (block (result i32)
  ;; RTRIP-NEXT:      (local.set $scratch
  ;; RTRIP-NEXT:       (local.get $start)
  ;; RTRIP-NEXT:      )
  ;; RTRIP-NEXT:      (local.set $2
  ;; RTRIP-NEXT:       (i32.const 2)
  ;; RTRIP-NEXT:      )
  ;; RTRIP-NEXT:      (local.get $scratch)
  ;; RTRIP-NEXT:     )
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.get $scratch_4)
  ;; RTRIP-NEXT:   )
  ;; RTRIP-NEXT:   (local.get $1)
  ;; RTRIP-NEXT:   (local.get $2)
  ;; RTRIP-NEXT:  )
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $slice-start-get (type $0) (result stringref)
  ;; RRTRP-NEXT:  (local $start i32)
  ;; RRTRP-NEXT:  (local $1 i32)
  ;; RRTRP-NEXT:  (local $2 i32)
  ;; RRTRP-NEXT:  (local $scratch i32)
  ;; RRTRP-NEXT:  (local $scratch_4 (ref string))
  ;; RRTRP-NEXT:  (local $scratch_5 i32)
  ;; RRTRP-NEXT:  (local $scratch_6 (ref string))
  ;; RRTRP-NEXT:  (stringview_wtf16.slice
  ;; RRTRP-NEXT:   (block (result (ref string))
  ;; RRTRP-NEXT:    (local.set $scratch_6
  ;; RRTRP-NEXT:     (string.const "abc")
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.set $1
  ;; RRTRP-NEXT:     (block (result i32)
  ;; RRTRP-NEXT:      (local.set $scratch_5
  ;; RRTRP-NEXT:       (local.get $start)
  ;; RRTRP-NEXT:      )
  ;; RRTRP-NEXT:      (local.set $2
  ;; RRTRP-NEXT:       (i32.const 2)
  ;; RRTRP-NEXT:      )
  ;; RRTRP-NEXT:      (local.get $scratch_5)
  ;; RRTRP-NEXT:     )
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.get $scratch_6)
  ;; RRTRP-NEXT:   )
  ;; RRTRP-NEXT:   (local.get $1)
  ;; RRTRP-NEXT:   (local.get $2)
  ;; RRTRP-NEXT:  )
  ;; RRTRP-NEXT: )
  (func $slice-start-get (result stringref)
    (local $start i32)
    (stringview_wtf16.slice
      (string.const "abc")
      (local.get $start)
      (i32.const 2)
    )
  )


  ;; CHECK:      (func $slice-end-get (type $0) (result stringref)
  ;; CHECK-NEXT:  (local $end i32)
  ;; CHECK-NEXT:  (stringview_wtf16.slice
  ;; CHECK-NEXT:   (string.const "abc")
  ;; CHECK-NEXT:   (i32.const 1)
  ;; CHECK-NEXT:   (local.get $end)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $slice-end-get (type $0) (result stringref)
  ;; RTRIP-NEXT:  (local $end i32)
  ;; RTRIP-NEXT:  (local $1 i32)
  ;; RTRIP-NEXT:  (local $2 i32)
  ;; RTRIP-NEXT:  (local $scratch i32)
  ;; RTRIP-NEXT:  (local $scratch_4 (ref string))
  ;; RTRIP-NEXT:  (stringview_wtf16.slice
  ;; RTRIP-NEXT:   (block (result (ref string))
  ;; RTRIP-NEXT:    (local.set $scratch_4
  ;; RTRIP-NEXT:     (string.const "abc")
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.set $1
  ;; RTRIP-NEXT:     (block (result i32)
  ;; RTRIP-NEXT:      (local.set $scratch
  ;; RTRIP-NEXT:       (i32.const 1)
  ;; RTRIP-NEXT:      )
  ;; RTRIP-NEXT:      (local.set $2
  ;; RTRIP-NEXT:       (local.get $end)
  ;; RTRIP-NEXT:      )
  ;; RTRIP-NEXT:      (local.get $scratch)
  ;; RTRIP-NEXT:     )
  ;; RTRIP-NEXT:    )
  ;; RTRIP-NEXT:    (local.get $scratch_4)
  ;; RTRIP-NEXT:   )
  ;; RTRIP-NEXT:   (local.get $1)
  ;; RTRIP-NEXT:   (local.get $2)
  ;; RTRIP-NEXT:  )
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $slice-end-get (type $0) (result stringref)
  ;; RRTRP-NEXT:  (local $end i32)
  ;; RRTRP-NEXT:  (local $1 i32)
  ;; RRTRP-NEXT:  (local $2 i32)
  ;; RRTRP-NEXT:  (local $scratch i32)
  ;; RRTRP-NEXT:  (local $scratch_4 (ref string))
  ;; RRTRP-NEXT:  (local $scratch_5 i32)
  ;; RRTRP-NEXT:  (local $scratch_6 (ref string))
  ;; RRTRP-NEXT:  (stringview_wtf16.slice
  ;; RRTRP-NEXT:   (block (result (ref string))
  ;; RRTRP-NEXT:    (local.set $scratch_6
  ;; RRTRP-NEXT:     (string.const "abc")
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.set $1
  ;; RRTRP-NEXT:     (block (result i32)
  ;; RRTRP-NEXT:      (local.set $scratch_5
  ;; RRTRP-NEXT:       (i32.const 1)
  ;; RRTRP-NEXT:      )
  ;; RRTRP-NEXT:      (local.set $2
  ;; RRTRP-NEXT:       (local.get $end)
  ;; RRTRP-NEXT:      )
  ;; RRTRP-NEXT:      (local.get $scratch_5)
  ;; RRTRP-NEXT:     )
  ;; RRTRP-NEXT:    )
  ;; RRTRP-NEXT:    (local.get $scratch_6)
  ;; RRTRP-NEXT:   )
  ;; RRTRP-NEXT:   (local.get $1)
  ;; RRTRP-NEXT:   (local.get $2)
  ;; RRTRP-NEXT:  )
  ;; RRTRP-NEXT: )
  (func $slice-end-get (result stringref)
    (local $end i32)
    (stringview_wtf16.slice
      (string.const "abc")
      (i32.const 1)
      (local.get $end)
    )
  )

  ;; CHECK:      (func $slice-both-get (type $0) (result stringref)
  ;; CHECK-NEXT:  (local $start i32)
  ;; CHECK-NEXT:  (local $end i32)
  ;; CHECK-NEXT:  (stringview_wtf16.slice
  ;; CHECK-NEXT:   (string.const "abc")
  ;; CHECK-NEXT:   (local.get $start)
  ;; CHECK-NEXT:   (local.get $end)
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $slice-both-get (type $0) (result stringref)
  ;; RTRIP-NEXT:  (local $start i32)
  ;; RTRIP-NEXT:  (local $end i32)
  ;; RTRIP-NEXT:  (stringview_wtf16.slice
  ;; RTRIP-NEXT:   (string.const "abc")
  ;; RTRIP-NEXT:   (local.get $start)
  ;; RTRIP-NEXT:   (local.get $end)
  ;; RTRIP-NEXT:  )
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $slice-both-get (type $0) (result stringref)
  ;; RRTRP-NEXT:  (local $start i32)
  ;; RRTRP-NEXT:  (local $end i32)
  ;; RRTRP-NEXT:  (stringview_wtf16.slice
  ;; RRTRP-NEXT:   (string.const "abc")
  ;; RRTRP-NEXT:   (local.get $start)
  ;; RRTRP-NEXT:   (local.get $end)
  ;; RRTRP-NEXT:  )
  ;; RRTRP-NEXT: )
  (func $slice-both-get (result stringref)
    (local $start i32)
    (local $end i32)
    (stringview_wtf16.slice
      (string.const "abc")
      (local.get $start)
      (local.get $end)
    )
  )

  ;; CHECK:      (func $length (type $1) (result i32)
  ;; CHECK-NEXT:  (string.measure_wtf16
  ;; CHECK-NEXT:   (string.const "abc")
  ;; CHECK-NEXT:  )
  ;; CHECK-NEXT: )
  ;; RTRIP:      (func $length (type $1) (result i32)
  ;; RTRIP-NEXT:  (string.measure_wtf16
  ;; RTRIP-NEXT:   (string.const "abc")
  ;; RTRIP-NEXT:  )
  ;; RTRIP-NEXT: )
  ;; RRTRP:      (func $length (type $1) (result i32)
  ;; RRTRP-NEXT:  (string.measure_wtf16
  ;; RRTRP-NEXT:   (string.const "abc")
  ;; RRTRP-NEXT:  )
  ;; RRTRP-NEXT: )
  (func $length (result i32)
    ;; This should be parsed as string.measure_wtf16 instead.
    (stringview_wtf16.length
      (string.as_wtf16
        (string.const "abc")
      )
    )
  )
)
