# RUN: llvm-mc -show-encoding -triple=wasm32-unknown-unknown -mattr=+reference-types,+tail-call,+gc < %s | FileCheck %s # RUN: llvm-mc -show-encoding -triple=wasm64-unknown-unknown -mattr=+reference-types,+tail-call,+gc < %s | FileCheck %s # Verify that dropping the tail-call feature rejects return_call_ref. The # reference-types predicate is not enforced at the parser level today (shared # with other Requires<[HasReferenceTypes]> opcodes such as ref.null_func), so # we only assert the tail-call gate. # RUN: not llvm-mc -triple=wasm32-unknown-unknown -mattr=+reference-types,+gc %s 2>&1 \ # RUN: | FileCheck --check-prefix=NO-TAIL-CALL %s # NO-TAIL-CALL: error: instruction requires: tail-call call_ref_void: .functype call_ref_void () -> () ref.null_func # CHECK: ref.cast () -> () # encoding: [0xfb,0x16, # CHECK-NEXT: fixup A - offset: 2, value: .Ltypeindex0@TYPEINDEX, kind: fixup_uleb128_i32 ref.cast () -> () # CHECK: call_ref () -> () # encoding: [0x14, # CHECK-NEXT: fixup A - offset: 1, value: .Ltypeindex1@TYPEINDEX, kind: fixup_uleb128_i32 call_ref () -> () end_function call_ref_sig: .functype call_ref_sig () -> (i32) i32.const 1 i32.const 2 ref.null_func # CHECK: ref.cast (i32, i32) -> (i32) # encoding: [0xfb,0x16, # CHECK-NEXT: fixup A - offset: 2, value: .Ltypeindex2@TYPEINDEX, kind: fixup_uleb128_i32 ref.cast (i32, i32) -> (i32) # CHECK: call_ref (i32, i32) -> (i32) # encoding: [0x14, # CHECK-NEXT: fixup A - offset: 1, value: .Ltypeindex3@TYPEINDEX, kind: fixup_uleb128_i32 call_ref (i32, i32) -> (i32) end_function return_call_ref_void: .functype return_call_ref_void () -> () ref.null_func # CHECK: return_call_ref () -> () # encoding: [0x15, # CHECK-NEXT: fixup A - offset: 1, value: .Ltypeindex4@TYPEINDEX, kind: fixup_uleb128_i32 return_call_ref () -> () end_function